《OpenCV图像处理》——2.7 直方图

简介:

本节书摘来自华章计算机《OpenCV图像处理》一书中的第2章,第2.7节,作者:[西]葛罗瑞亚·布埃诺·加西亚(Gloria Bueno García)著,更多章节内容可以访问云栖社区“华章计算机”公众号查看

2.7 直方图

一旦图像被定义为一种数据类型,并能够访问该图像的灰度值(即像素),我们可能想得到一个不同灰度的概率密度函数,称为该图像的直方图(histogram)。图像直方图表示图像中各种灰度出现的频率。可以对直方图建模,使图像可以改变其对比度,被称为直方图均衡化(histogram equalization)。直方图建模对于以对比度变化的方式进行图像增强是一种非常有用的技术。直方图均衡化允许低对比度的图像区域获取更高的对比度。图2-5向您展示了一幅均衡化后的图像及其直方图的一个示例:
screenshot

在OpenCV中,使用函数void calcHist可以计算图像直方图,使用函数void equalizeHist可进行直方图均衡化。
图像直方图的计算用十个参数来定义:
void calcHist(const Mat images, int nimages, const int channels, InputArray mask, OutputArray hist, int dims, const int histSize, const f?loat* ranges, bool uniform=true, and bool accumulate=false).
const Mat* images:第一个参数是集合中第一幅图像的地址,可用于处理一批图像。
int nimages:第二个参数是原图像的数量。
const int* channels:第三个参数是用来计算直方图的通道列表,通道数从0到2。
InputArray mask:这个参数是一个可选项mask,用来指示直方图中图像像素的个数。
OutputArray hist:第五个参数是输出直方图。
int dims:这个参数用于指示直方图的维数。
const int* histSize:这个参数是每一维度上直方图大小的数组。
const f?loat** ranges:这个参数是每一维度上直方图bin边界维度数组的数组。
bool uniform=true:默认情况下,该布尔值为true。表示直方图是均匀分布的。
bool accumulate=false:默认情况下,Boolean值为false。表示直方图是不累加的。
直方图均衡化只需要两个参数:void equalizeHist(InputArray src, OutputArray dst)。其中,第一个参数是输入图像,第二个参数是输出直方图均衡化后的图像。
还可以计算多幅输入图像的直方图,使您可以比较这些图像直方图和计算多幅图像的联合直方图。可以使用函数void compareHist(InputArray histImage1, InputArray histImage2, method)进行两个图像直方图histImage1和histImage2的比较。方法metric用于计算两个直方图之间的匹配情况。在OpenCV中实现了四个metric方法:correlation (CV_COMP_CORREL)、chi-square (CV_COMP_CHISQR),intersection distance或者minimum distance (CV_COMP_INTERSECT)和Bhattacharyya distance (CV_COMP_BHATTACHARYYA)。
也可以计算同一幅彩色图像的多个通道的直方图,因为有第三个参数使其成为
可能。
下面的小节将向您展示两个示例的代码,用于彩色直方图计算(ColourImage-EqualizeHist)和比较(ColourImageComparison)。在ColourImageEqualizeHist示例中,还说明了如何计算直方图均衡化以及有两个通道的二维直方图,也即ColourImage-Comparison示例中的色度(H)和饱和度(S)。
2.7.1 ColourImageEqualizeHist示例代码
下面的ColourImageEqualizeHist示例向您展示如何均衡化一幅彩色图像以及同时显示每个通道的直方图。使用函数histogramcalculation(InputArray Imagesrc, OutputArray histoImage)计算RGB图像中每个颜色通道的直方图。为此,将彩色图像划分成R、G和B通道。直方图均衡化还可以应用于每个通道,进而将它们合并形成均衡化的彩色图像:

screenshot
screenshot
screenshot
screenshot
screenshot
screenshot

该示例创建了如下四个窗口:
原图像:显示在下图中的左上角。
均衡化的彩色图像:显示在下图中的右上角。
三个通道的直方图:这里对于原图像,R=Read、G=Green和B=Blue,显示在下图中的左下角。
均衡化图像的RGB通道的直方图:显示在下图的右下角。该图向您展示,在均衡化处理中如何对R、G和B最高频的强度值进行拉伸。
图2-6展示了该算法的结果:
screenshot

2.7.2 ColourImageComparison示例代码
下面的ColourImageComparison示例向您展示,如何计算由同一幅彩色图像的两个通道构成一个二维直方图。通过直方图匹配,该示例代码还执行了一个原图像与均衡化后的图像之间的比较。前面已经介绍过,用于匹配度量的方法有四种:Correlation、Chi-Square、Minimum distance和Bhattacharyya distance。使用函数histogram2Dcalculation(InputArray Imagesrc, OutputArray histo2D)进行H和S颜色通道的二维直方图计算。为了进行直方图的比较,需要对RGB图像计算归一化的一维直方图。为了比较直方图,已经对这些直方图进行了归一化处理,用到的函数是histogramRGcal culation(InputArray Imagesrc, OutputArray histo)。

screenshot
screenshot
screenshot
screenshot
screenshot
screenshot

该示例创建了四个窗口:原图像、均衡化的彩色图像、原始图像的H通道和S通道的二维直方图以及均衡化图像的H通道和S通道的二维直方图。算法还显示了由原始的RGB图像直方图与其自身以及均衡化后的RGB图像比较得到的四个数值匹配参数。对于correlation方法和intersection方法,度量值越高,匹配越精确。对于chi-square方法和Bhattacharyya distance方法,结果越小,匹配越好。图2-7展示了ColourImageComparison算法的输出:

screenshot

最后,可以参考第3章以及涵盖这一广泛主题基本方面的一些示例,如通过直方图模型实现图像增强等。

相关文章
|
4月前
|
openCL 开发工具 C语言
OpenCV 图像处理学习手册:6~7
OpenCV 图像处理学习手册:6~7
84 0
|
3月前
|
人工智能 Linux API
OpenCV这么简单为啥不学——1.1、图像处理(灰度图、模糊图片、GaussianBlur函数、提取边缘、边缘膨胀、边缘细化)
OpenCV这么简单为啥不学——1.1、图像处理(灰度图、模糊图片、GaussianBlur函数、提取边缘、边缘膨胀、边缘细化)
48 0
|
5天前
|
算法 计算机视觉
【OpenCV】计算机视觉图像处理基础知识(下)
【OpenCV】计算机视觉图像处理基础知识(下)
|
5天前
|
人工智能 计算机视觉 Python
【OpenCV】计算机视觉图像处理基础知识(上)
【OpenCV】计算机视觉图像处理基础知识(上)
|
14天前
|
算法 安全 机器人
最新版opencv4.9安装介绍,基本图像处理详解
最新版opencv4.9安装介绍,基本图像处理详解
|
15天前
|
计算机视觉 索引
【OpenCV】- 直方图反向投影
【OpenCV】- 直方图反向投影
|
15天前
|
计算机视觉 索引
【OpenCV】直方图计算 & 均衡化直方图
【OpenCV】直方图计算 & 均衡化直方图
|
26天前
|
机器学习/深度学习 存储 算法
OpenCV与NumPy:图像处理中的黄金组合
【4月更文挑战第17天】OpenCV和NumPy是Python图像处理的两大利器,互补协作形成黄金组合。OpenCV专注计算机视觉,提供丰富算法,而NumPy擅长数值计算和数组操作。两者无缝对接,共同实现高效、灵活的图像处理任务。通过灰度化、二值化、边缘检测等案例,展示了它们的协同作用。未来,这一组合将在计算机视觉和机器学习领域发挥更大作用,解锁更多图像处理潜力。
|
27天前
|
机器学习/深度学习 算法 Linux
使用OpenCV在Python中进行图像处理
使用OpenCV在Python中进行图像处理
|
1月前
|
算法 Serverless 计算机视觉
opencv 直方图处理(python)
opencv 直方图处理(python)