本节将简要介绍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),简称累计直方图,代表图像组成成分在灰度级的累计概率分布情况,每一个概率值代表小于等于此灰度值的概率,记为𝑐(𝑘),它也可以用ℎ(𝑘)得到。
以下是三种直方图的定义:
式中,𝑘是图像灰度级的取值,表示取值为𝑘的像素点数目,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 : : )
参数说明:
- Region: 输入区域,指定要计算直方图的图像区域。
- Image: 输入图像,灰度图像。
- Histogram: 输出直方图,返回一个包含灰度值分布的数组。
(3) gray_histo_range算子
Halcon使用gray_histo_range算子用于计算图像中指定区域内灰度值在某个范围内的直方图信息。与 gray_histo_abs 不同,gray_histo_range 允许用户指定一个灰度值范围,并仅计算该范围内的像素分布。
算子声明:
gray_histo_range(Region, Image : Histogram : MinGray, MaxGray, NumBins : )
参数说明:
- Region: 输入区域,指定要计算直方图的图像区域。
- Image: 输入图像,灰度图像。
- Histogram: 输出直方图,返回一个数组,表示指定灰度范围内的像素分布。
- MinGray: 输入参数,指定灰度范围的最小值。
- MaxGray: 输入参数,指定灰度范围的最大值。
- 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表示列索引。
注意事项:
- 在使用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: 输入参数,指定直方图的缩放比例。
使用方法:
- 计算直方图: 使用 gray_histo 或 gray_histo_range 等算子计算图像的直方图。
- 设置起始坐标: 指定生成区域的起始位置(Row 和 Column)。
- 设置缩放比例: 指定直方图的缩放比例(Scale),用于调整生成区域的大小。
- 生成区域: 使用 gen_region_histo 将直方图转换为区域。
- 可视化或进一步处理: 对生成的区域进行显示或进一步分析。
实例:
* 读取图像
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 计算直方图的中位数(灰度值的中间值)。
附录:算子列表
- gray_histo:计算直方图
- gray_histo_abs:计算灰度值分布
- equ_histo_image:直方图均衡化
- histo_2dim:计算量通道灰度图像的直方图
- gen_region_histo:将直方图转换为一个区域,用于展示直方图
(未完待续,最新更新2025-02-06)
本专栏将介绍基于Halcon的各种传统经典的数字图像处理技术,所介绍内容基本与Gonzalez的教材基本保持一致。作为学习和实践DIP技术的入门教程。
感谢大家的支持和浏览,本专栏将持续更新(每周至少更新1篇),每篇的篇幅控制在5000字左右,这样大家阅读起来也比较轻松。估计2025年上半年完成全部内容,欢迎加收藏。但由于到了假期,更新的速度不会很快。
在专栏全部完成之前,所有内容将一直免费。