基础篇05-直方图操作

本节将简要介绍Halcon中有关图像直方图操作的算子,重点介绍直方图获取和显示两类算子,以及直方图均衡化处理算子。

目录

1. 引言

2. 获取并显示直方图

2.1 获取(灰度)直方图

(1) gray_histogram

(2) gray_histo_abs

(3) gray_histo_range

(4) histo_2dim

2.2 显示直方图

(1) create_histo2d

(2) gen_region_histo

(3) get_grayval_range

3. 直方图操作

3.1 直方图均衡


1. 引言

图像直方图Histogram)是反映图像像素分布的统计表,记为ℎ(𝑘),横坐标代表像素值的取值区间,纵坐标代表每一像素值在图像中的像素总数(对应普通直方图)或者所占的百分比(对应归一化直方图)。

归一化直方图Uniform Histogram)是图像灰度级的函数,用来描述每个灰度级在图像矩阵中的发生的概率,记为𝑝(𝑘),它可以ℎ(𝑘)用得到。

累计分布直方图Cumulitive Distribution Histogram),简称累计直方图,代表图像组成成分在灰度级的累计概率分布情况,每一个概率值代表小于等于此灰度值的概率,记为𝑐(𝑘),它也可以用ℎ(𝑘)得到。

以下是三种直方图的定义:

h(k)=n_k,\quad p(k)=\frac{n_k}{N},\quad c=\frac{1}{N} \sum_{i=0}^{k}n_i,\quad k=0,1,\cdots,L-1

式中,𝑘是图像灰度级的取值,n_k表示取值为𝑘的像素点数目,N是图像内像素点的总数。

下图是多幅图像及其对应的直方图情况,不难看出,灰度直方图反映了图像中的灰度分布规律,直观地表现了图像中各灰度级的占比,很好地体现出图像的亮度和对比度信息:

  • 灰度图分布居中说明亮度正常,偏左说明亮度较暗,偏右表明亮度较高;
  • 狭窄陡峭表明对比度降低,宽泛平缓表明对比度较高。

(从左至右分别是较暗、较亮、较黯淡,以及高对比度图像及其直方图示例)

2. 获取并显示直方图

2.1 获取(灰度)直方图

(1) gray_histo算子

在Halcon中使用gray_histo算子获取图像的直方图。该算子计算图像的灰度值分布,并返回直方图的频数。根据参数设置不同,可以获取普通直方图和归一化直方图

算子声明

gray_histo(Image : : : AbsoluteHisto, RelativeHisto)

参数说明

  • Image:输入图像。
  • AbsoluteHisto:绝对直方图,表示每个灰度值的像素数量。
  • RelativeHisto:归一化直方图,表示每个灰度值的像素比例(概率)。

注意事项

  • 如果输入图像是彩色的,需要先转换为灰度图像。
  • 如果要显示直方图,需要使用gen_region_histo算子将直方图转换为图像的函数,方便可视化。

(2) gray_histo_abs算子

除了计算全局直方图信息外,Halcon还提供了gray_histo_abs算子用于获取图像局部区域的直方图信息,非常方便。在此列出该算子的声明和参数说明。

算子声明

gray_histo_abs(Region, Image : Histogram : : )

参数说明

  1. Region: 输入区域,指定要计算直方图的图像区域。
  2. Image: 输入图像,灰度图像。
  3. Histogram: 输出直方图,返回一个包含灰度值分布的数组。

(3) gray_histo_range算子

Halcon使用gray_histo_range算子用于计算图像中指定区域内灰度值在某个范围内的直方图信息。与 gray_histo_abs 不同,gray_histo_range 允许用户指定一个灰度值范围,并仅计算该范围内的像素分布。

算子声明

gray_histo_range(Region, Image : Histogram : MinGray, MaxGray, NumBins : )

参数说明

  1. Region: 输入区域,指定要计算直方图的图像区域。
  2. Image: 输入图像,灰度图像。
  3. Histogram: 输出直方图,返回一个数组,表示指定灰度范围内的像素分布。
  4. MinGray: 输入参数,指定灰度范围的最小值。
  5. MaxGray: 输入参数,指定灰度范围的最大值。
  6. NumBins: 输入参数,指定直方图的区间数(即将灰度范围分成多少个区间)。

(4) histo_2dim

Halcon使用histo_2dim算子计算双通道灰度值图像的直方图,即构建二维直方图。

算子声明

histo_2dim(Regions, ImageCol, ImageRow : Histo2Dim : : )

参数说明

  • Regions:输入区域,在此区域内计算直方图。这些区域通常是从图像中分割出来的一部分或多部分,即感兴趣区域(ROI)。
  • ImageCol:多通道图像的第一个通道,其数据将被用于计算直方图的第一维。
  • ImageRow:多通道图像的第二个通道,其数据将被用于计算直方图的第二维。
  • Histo2Dim:计算得出的二维直方图。输出是一个整数类型的图像,其中的每个像素值代表了对应灰度级组合出现的频率。

使用说明:

  • histo_2dim算子计算的是输入区域Regions内,由ImageCol和ImageRow两个通道构成的二维特征空间的直方图。
  • 在这个二维特征空间中,ImageCol的灰度值被解释为行索引,ImageRow的灰度值被解释为列索引。
  • 输出图像Histo2Dim中的每个点P(g1,g2)的灰度值表示(g1,g2)灰度值组合的频率,其中g1表示行索引,g2表示列索引。

注意事项

  1. 在使用histo_2dim算子时,需要确保输入图像的两个通道具有相同的尺寸和数据类型。

2.2 显示直方图

(1) gen_region_histo

    Halcon使用gen_region_histo算子用于根据直方图生成一个区域(Region)。该算子将直方图的灰度值分布转换为一个区域,通常用于可视化直方图或基于直方图的分析。

    算子声明

    gen_region_histo(Histogram : Region : Row, Column, Scale : )

    参数说明

    • Histogram: 输入直方图,通常是一个数组,表示灰度值的分布。
    • Region: 输出区域,生成的区域表示直方图的形状。
    • Row: 输入参数,指定生成区域的起始行坐标。
    • Column: 输入参数,指定生成区域的起始列坐标。
    • Scale: 输入参数,指定直方图的缩放比例。

    使用方法

    1. 计算直方图: 使用 gray_histo 或 gray_histo_range 等算子计算图像的直方图。
    2. 设置起始坐标: 指定生成区域的起始位置(Row 和 Column)。
    3. 设置缩放比例: 指定直方图的缩放比例(Scale),用于调整生成区域的大小。
    4. 生成区域: 使用 gen_region_histo 将直方图转换为区域。
    5. 可视化或进一步处理: 对生成的区域进行显示或进一步分析。

    实例:

    * 读取图像
    read_image(Image, 'example_image.png')
    
    * 转换为灰度图像
    rgb1_to_gray(Image, GrayImage)
    
    * 计算灰度直方图
    gray_histo(GrayImage, GrayImage, Histogram)
    
    * 定义直方图的起始位置和缩放因子
    Row := 100
    Column := 100
    Scale := 1.0
    
    * 生成基于直方图的区域
    gen_region_histo(RegionHisto, Histogram, Row, Column, Scale)
    
    * 显示生成的区域
    dev_display(GrayImage)
    dev_display(RegionHisto)

    注意事项

    • 直方图数据:确保输入的直方图数据是有效的数组。如果直方图数据为空或无效,生成的区域可能为空。
    • 起始坐标:确保 Row 和 Column 在图像范围内,否则生成的区域可能不可见。
    • 缩放比例:缩放比例 Scale 影响生成区域的大小。较大的缩放比例会生成较大的区域。

    (2) get_grayval_range

    在显示直方图信息时,Halcon使用了get_grayval_range算子用于获取图像中灰度值的范围(最小值和最大值)。这个算子对于分析图像的灰度分布非常有用,尤其是在直方图计算和图像增强等操作中。

    算子声明

    get_grayval_range(Image : : : MinGray, MaxGray)

    参数说明

    • Image:输入图像(可以是灰度图像或多通道图像)。
    • MinGray:图像中灰度值的最小值。
    • MaxGray:图像中灰度值的最大值。

      3. 直方图操作

      在Halcon中提供的直方图操作主要是两种,直方图均衡和直方图规定化。两者都能实现特定的图像增强目的,但又有区别。

      3.1 直方图均衡

      直方图均衡化Histogram Equalization,简称直方图均衡,HE)是一种简单有效的图像增强技术。根据直方图的形态可以判断图像的质量,通过调控直方图的形态可以改善图像的质量。

      直方图均衡的基本思想是对图像中占比大的灰度级进行展宽,而对占比小的灰度级进行压缩,使图像的直方图分布较为均匀,扩大灰度值差别的动态范围,从而增强图像整体的对比度。

      Halcon提供了equ_histo_image算子来实现直方图均衡化。

      算子声明

      equ_histo_image(Image : ImageEquHisto : : )

      参数说明

      • Image(输入):输入图像(通常是灰度图像)。
      • ImageEquHisto(输出):直方图均衡化后的图像。

      以下是一个完整的Halcon代码示例,展示如何实现直方图均衡化。

      * 读取图像
      read_image(Image, 'example_image.jpg')
      
      * 将图像转换为灰度图像(如果图像是彩色的)
      rgb1_to_gray(Image, GrayImage)
      
      * 对图像进行直方图均衡化
      equ_histo_image(GrayImage, ImageEquHisto)
      
      * 设置显示窗口
      dev_open_window(0, 0, 512, 512, 'black', WindowHandle1)
      dev_set_window(WindowHandle1)
      dev_display(GrayImage)
      dev_open_window(512, 0, 512, 512, 'black', WindowHandle2)
      dev_set_window(WindowHandle2)
      dev_display(ImageEquHisto)
      
      * 显示消息
      disp_message(WindowHandle1, 'Original Image', 'window', 12, 12, 'black', 'true')
      disp_message(WindowHandle2, 'Histogram Equalized Image', 'window', 12, 12, 'black', 'true')

      注意事项

      • 输入图像:equ_histo_image 适用于灰度图像。如果输入是彩色图像,需要先转换为灰度图像。

      3.2 计算直方图的统计特性

      直方图均衡化Histogram Equalization,简称直方图均衡,HE)是一种简单有效的图像增强技术。根据直方图的形态可以判断图像的质量,通过调控直方图的形态可以改善图像的质量。

      以下函数可能不存在

      histo_to_mean    根据直方图计算灰度值的均值。
      histo_to_entropy    根据直方图计算灰度值的熵(用于衡量图像的信息量)。
      histo_to_relative_entropy    计算两个直方图之间的相对熵(Kullback-Leibler 散度)。
      histo_to_histogramm_cumulative    计算累积直方图。
      histo_to_histogramm_normalized    计算归一化直方图(将直方图值缩放到 [0,1] 范围)。
      histo_to_histogramm_smooth    对直方图进行平滑处理,减少噪声。
      histo_to_histogramm_equalize    对直方图进行均衡化处理,增强图像对比度。
      histo_to_histogramm_match    将直方图与参考直方图进行匹配(直方图规定化)。
      histo_to_histogramm_compare    比较两个直方图的相似性(如欧氏距离、卡方距离等)。
      histo_to_histogramm_peak    查找直方图中的峰值(用于检测主要灰度值)。
      histo_to_histogramm_valley    查找直方图中的谷值(用于分割不同灰度区域)。
      histo_to_histogramm_threshold    根据直方图计算阈值(用于图像分割)。
      histo_to_histogramm_otsu    使用 Otsu 方法根据直方图计算最佳阈值(用于图像分割)。
      histo_to_histogramm_max    查找直方图中的最大值及其对应的灰度值。
      histo_to_histogramm_min    查找直方图中的最小值及其对应的灰度值。
      histo_to_histogramm_mean    计算直方图的均值(灰度值的加权平均)。
      histo_to_histogramm_stddev    计算直方图的标准差(灰度值的离散程度)。
      histo_to_histogramm_median    计算直方图的中位数(灰度值的中间值)。

      附录:算子列表

      1. gray_histo:计算直方图
      2. gray_histo_abs:计算灰度值分布
      3. equ_histo_image:直方图均衡化
      4. histo_2dim:计算量通道灰度图像的直方图
      5. gen_region_histo:将直方图转换为一个区域,用于展示直方图

      (未完待续,最新更新2025-02-06)

      本专栏将介绍基于Halcon的各种传统经典的数字图像处理技术,所介绍内容基本与Gonzalez的教材基本保持一致。作为学习和实践DIP技术的入门教程。

      感谢大家的支持和浏览,本专栏将持续更新(每周至少更新1篇),每篇的篇幅控制在5000字左右,这样大家阅读起来也比较轻松。估计2025年上半年完成全部内容,欢迎加收藏。但由于到了假期,更新的速度不会很快。

      在专栏全部完成之前,所有内容将一直免费。

      本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:/a/965764.html

      如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

      相关文章

      3.攻防世界 weak_auth

      题目描述提示 是一个登录界面,需要密码登录 进入题目页面如下 弱口令密码爆破 用1 or 1 #试试 提示用admin登录 则尝试 用户名admin密码:123456 直接得到flag 常用弱口令密码(可复制) 用户名 admin admin-- admin or -- admin…

      金蛇祈福,鸿运开年!广州白云皮具城2025开市大吉!

      锣鼓一响,黄金万两!2月6日大年初九,广州白云皮具城举行盛大的醒狮开市仪式!象征吉祥如意的醒狮,将好运、财运传递给全体商户和八方来客。 醒狮点睛 金鼓一响黄金万两,十头醒狮登台,董事总经理刘…

      【Axure教程】标签版分级多选下拉列表

      分级多选下拉列表是指一个下拉列表,它包含多个层次的选项,用户可以选择一个或多个选项。这些选项通常是根据某种层级关系来组织的,例如从上到下有不同的分类或者过滤条件,用户选择上层选项后,下层选项会发生变化&#…

      SpringBoot中的多环境配置管理

      SpringBoot中的多环境配置管理 文章目录 SpringBoot中的多环境配置管理SpringBoot中的多环境配置管理 多环境配置的概述1. 为什么需要多环境配置?2. Spring Boot 中如何实现多环境配置?3. 多环境配置的应用场景4. 如何实现配置隔离? Spring B…

      SOME/IP报文格式及发现协议详解

      在之前的文章中,我们介绍了SOME/IP协议的几种服务接口。在本篇博客中,主要介绍some/ip协议传输的header报文格式以及SOME/IP-SD发现协议。 目录 流程 报文格式 Message ID Length Request ID protocal version/Interface Version Message Type…

      使用Ollama本地部署deepseek

      1、下载安装Ollama 前往下载页面 https://ollama.com/download下载好安装包,如同安装软件一样,直接安装即可 win中默认为C盘,如果需要修改到其他盘,查找具体教程 运行list命令,检查是否安装成功 2、修改模型下载的…

      约束布局属性学习

      1、layout_constraintHorizontal_bias layout_constraintHorizontal_bias 是 ConstraintLayout 中的一个重要属性,用于控制一个视图在父视图或相关视图中水平位置的偏移。这种偏移通过在0到1之间的浮点值来设置,0代表完全靠近左边或起始位置&#xff0c…

      Windows双网卡冲突导致网页加载过慢的解决方法 (修改跃点无效 远程桌面连接)

      【本文发布于https://blog.csdn.net/Stack_/article/details/145494160,未经许可不得转载,转载须注明出处】 办公室内,我的笔记本和台式机都连接WIFI进行上网,网段是192.168.0.x,网关192.168.0.101 现在要通过Windows自…

      轻量级服务器http-server

      安装 sudo npm install http-server -g 运行 1. 直接去到要跑起来的目录,在终端输入 cd xxxx文件夹http-server //只输入http-server的话,更新了代码后,页面不会同步更新http-server -c-1 //同步更新页面http-server -a 127.0.0.1 -p 808…

      代码随想录算法【Day38】

      Day38 322. 零钱兑换 思路 完全背包 代码 class Solution { public:int coinChange(vector<int>& coins, int amount) {vector<int> dp(amount 1, INT_MAX);dp[0] 0;for (int i 0; i < coins.size(); i) { // 遍历物品for (int j coins[i]; j <…

      python+opencv+open3d实现鼠标手画多边形裁剪分割点云操作

      👑主页:吾名招财 👓简介:工科学硕,研究方向机器视觉,爱好较广泛… ​💫签名:面朝大海,春暖花开! python+opencv+open3d实现鼠标手画多边形裁剪分割点云操作 引言使用效果:代码pcd_roi_crop.py:引言 当我们想对一个不规则物体的图像或者点云裁剪时,直接手动输入…

      STM32的HAL库开发---通用定时器(TIMER)---定时器脉冲计数

      一、脉冲计数实验原理 1、 外部时钟模式1&#xff1a;核心为蓝色部分的时基单元&#xff0c;时基单元的时钟源可以来自四种&#xff0c;分别是内部时钟PCLK、外部时钟模式1&#xff0c;外部时钟模式2、内部定时器触发&#xff08;级联&#xff09;。而脉冲计数就是使用外部时钟…

      Redis05 - 性能调优和缓存问题

      Redis性能调优和缓存问题 文章目录 Redis性能调优和缓存问题一&#xff1a;链路追踪判断是不是redis出了问题二&#xff1a;redis变慢原因1&#xff1a;使用复杂度过高的命令(*)1.1&#xff1a;查看redis慢日志1.2&#xff1a;延迟变大原因分析1.3&#xff1a;解决方案 2&#…

      漫步 C++ 之途,领略引用的独特风姿

      在C中&#xff0c;引用&#xff08;Reference&#xff09;是一种非常有用的特性&#xff0c;它允许为一个变量创建一个别名&#xff08;Alias&#xff09;。引用在很多情况下可以替代指针&#xff0c;但使用起来更加方便和安全。以下是对C引用的详细介绍&#xff0c;包括其定义…

      Spring Boot Web 入门

      目录 Spring Boot Web 是 Spring Boot 框架的一个重要模块&#xff0c;它简化了基于 Spring 的 Web 应用程序的开发过程。以下是一个 Spring Boot Web 项目的入门指南&#xff0c;涵盖了项目创建、代码编写、运行等关键步骤。 1. 项目创建 使用 Spring Initializr 使用 IDE …

      Java 多线程、线程同步、线程池

      一. 线程 1. 线程&#xff1a;线程(Thread)是一个程序内部的一条执行流程。 2. 程序中如果只有一条执行流程&#xff0c;那这个程序就是单线程的程序。 二. 多线程 多线程是指从硬件上实现多条执行流程的技术(多条线程由CPU负责调度) Javas是通过java.lang.Thread类的对象来代…

      20.[前端开发]Day20-王者荣耀项目实战(三)

      01_(掌握)王者荣耀-main-赛事新闻列表实现 <!DOCTYPE html> <html lang"zh-CN"> <head><meta charset"UTF-8"><meta http-equiv"X-UA-Compatible" content"IEedge"><meta name"viewport" …

      【Langchain学习笔记(一)】Langchain介绍

      Langchain介绍 Langchain介绍前言1、Langchain 是什么2、为什么要用 Langchain3、Langchain 的核心4、Langchain 的底层原理5、Langchain 的应用场景 Langchain介绍 前言 想象一下&#xff0c;如果你能让聊天机器人不仅仅回答通用问题&#xff0c;还能从你自己的数据库或文件…

      IDEA2024版本创建Sping项目无法选择Java 8

      目录 一、背景二、解决方式&#xff08;替换创建项目的源地址&#xff09; 一、背景 IDEA2024创建一个springboot的项目&#xff0c;本地安装的是1.8&#xff0c;但是在使用Spring Initializr创建项目时&#xff0c;发现版本只有17、21、23。 二、解决方式&#xff08;替换创…

      C++11(四)

      目录 包装器 function包装器 bind绑定 更改实参传递的顺序和实参传递的个数 线程库 本期我们将继续进行C11新特性的学习。 包装器 function包装器 function包装器&#xff0c;我们也称之为适配器&#xff0c;本质上就是一个类模板&#xff0c;为什么要引入function包…