本节将简要介绍Halcon中有关图像直方图操作的算子,重点介绍直方图获取和显示算子,以及两种直方图处理算子。
目录
1. 引言
2. 获取并显示直方图
2.1 获取(灰度)直方图
2.2 显示直方图
3. 直方图操作
3.1 直方图均衡
1. 引言
图像直方图(Histogram)是反映图像像素分布的统计表,记为ℎ(𝑘),横坐标代表像素值的取值区间,纵坐标代表每一像素值在图像中的像素总数(对应普通直方图)或者所占的百分比(对应归一化直方图)。
归一化直方图(Uniform Histogram)是图像灰度级的函数,用来描述每个灰度级在图像矩阵中的发生的概率,记为𝑝(𝑘),它可以ℎ(𝑘)用得到。
累计分布直方图(Cumulitive Distribution Histogram),简称累计直方图,代表图像组成成分在灰度级的累计概率分布情况,每一个概率值代表小于等于此灰度值的概率,记为𝑐(𝑘),它也可以用ℎ(𝑘)得到。
以下是三种直方图的定义:
式中,𝑘是图像灰度级的取值,表示取值为𝑘的像素点数目,N是图像内像素点的总数。
下图是多幅图像及其对应的直方图情况,不难看出,灰度直方图反映了图像中的灰度分布规律,直观地表现了图像中各灰度级的占比,很好地体现出图像的亮度和对比度信息:
- 灰度图分布居中说明亮度正常,偏左说明亮度较暗,偏右表明亮度较高;
- 狭窄陡峭表明对比度降低,宽泛平缓表明对比度较高。
(从左至右分别是较暗、较亮、较黯淡,以及高对比度图像及其直方图示例)
2. 获取并显示直方图
2.1 获取(灰度)直方图
在Halcon中使用gray_histogram算子获取图像的直方图。该算子计算图像的灰度值分布,并返回直方图的频数。根据参数设置不同,可以获取普通直方图和归一化直方图。
算子声明:
gray_histogram(Image : : : AbsoluteHisto, RelativeHisto)
参数说明:
- Image:输入图像。
- AbsoluteHisto:绝对直方图,表示每个灰度值的像素数量。
- RelativeHisto:归一化直方图,表示每个灰度值的像素比例(概率)。
注意事项:
- 如果输入图像是彩色的,需要先转换为灰度图像。
- 如果要显示直方图,需要使用create_histo2d算子将直方图转换为图像的函数,方便可视化。
2.2 显示直方图
在Halcon中使用create_histo2d算子将直方图转换为图像形式进行显示。
算子声明:
create_histo2d(HistogramData : HistogramImage : XScale, YScale : )
参数说明:
- Image:输入图像。
- AbsoluteHisto:绝对直方图,表示每个灰度值的像素数量。
- RelativeHisto:归一化直方图,表示每个灰度值的像素比例(概率)。
一般步骤:
- 读取图像:使用 read_image 读取图像。
- 转换为灰度图像:如果图像是彩色的,使用 rgb1_to_gray 将其转换为灰度图像。
- 计算直方图:使用 gray_histogram 计算图像的绝对直方图和归一化直方图。
- 获取灰度值范围:使用 get_grayval_range 获取图像的最小和最大灰度值。
- 创建直方图图像:使用 create_histo2d 将直方图数据转换为图像形式。
- 设置显示窗口:使用 dev_open_window 和 dev_set_window 设置显示窗口。
- 显示原图和直方图:使用 dev_display 分别显示原图和直方图。
以下是一个完整的Halcon代码示例,展示如何获取图像的直方图并绘制结果。
* 读取图像
read_image(Image, 'example_image.jpg')* 将图像转换为灰度图像(如果图像是彩色的)
rgb1_to_gray(Image, GrayImage)* 计算图像的直方图
gray_histogram(GrayImage, AbsoluteHisto, RelativeHisto)* 获取图像的灰度值范围
get_grayval_range(GrayImage, MinGray, MaxGray)* 创建直方图的可视化图像
create_histo2d(AbsoluteHisto, HistogramImage, 1, 1)* 设置显示窗口
dev_open_window(0, 0, 512, 512, 'black', WindowHandle)
dev_set_window(WindowHandle)* 显示原图
dev_display(GrayImage)* 显示直方图
dev_open_window(0, 512, 512, 512, 'black', HistogramWindowHandle)
dev_set_window(HistogramWindowHandle)
dev_display(HistogramImage)
注意事项:
- 如果输入图像是彩色的,需要先转换为灰度图像。
- 使用get_grayval_range算子获取图像的最小和最大灰度值。
- 如果要显示直方图,需要使用create_histo2d算子将直方图转换为图像的函数,方便可视化。
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 适用于灰度图像。如果输入是彩色图像,需要先转换为灰度图像。
(未完待续,最新更新2025-02-06)
本专栏将介绍基于Halcon的各种传统经典的数字图像处理技术,所介绍内容基本与Gonzalez的教材保持一致。作为学习和实践DIP技术的入门教程。
感谢大家的支持和浏览,本专栏将持续更新,每篇的篇幅控制在5000字左右,这样大家阅读起来也比较轻松。估计2025年上半年完成全部内容,欢迎加收藏。但由于到了假期,更新的速度不会很快。
在专栏全部完成之前,所有内容将一直免费。