购买
下载掌阅APP,畅读海量书库
立即打开
畅读海量书库
扫码下载掌阅APP

第4章
图像直方图

前面的章节介绍了图像的很多基本属性,包括图像的高、宽、通道数目和数据类型等。常见的色彩空间的像素值都是有取值范围的,RGB色彩空间的图像3个通道的取值范围均为[0,255]。针对它们的取值范围计算出取值范围内每个数值出现的次数,从而得到像素值的最终分布统计信息。该信息既是图像的基本特征之一,同时也是图像数据的统计学特征,又称为图像直方图。

图像直方图作为图像的基本统计学特征,是不包括位置信息(图像空间信息)的,在图像处理、对象识别、特征提取等方面均有应用。常见的图像直方图处理主要包括直方图的计算与绘制、均衡化、相似性比较以及反向投影等。本章将对OpenCV中直方图相关的知识与应用进行详细解释,并提供相关代码演示。

4.1 像素统计信息

比较常见的图像像素统计信息包括计算图像的均值、方差、直方图等,这些信息在一定程度上可以帮助读者更好地理解图像的内容,对图像进行一些简单处理。下面先来看一下OpenCV中计算图像均值与方差的相关函数。

(1)计算图像均值的函数

其中,src表示输入的图像,mask表示掩膜层过滤,返回对象是对输入图像通道数计算均值后的Scalar对象。

(2)计算图像均值与方差的函数

其中,src表示输入的图像;mean表示输出图像通道的均值;stddev表示输出图像通道的方差;mask表示掩膜层。

下面的代码演示了彩色图像和灰度图像的均值与方差的计算。首先读入的是图片lena.jpg,然后将它转换为灰度图像,再分别计算彩色图像和灰度图像的均值与方差,当相关变量以Scalar类型返回时,相关代码如下:

运行结果如图4-1所示。

图4-1 均值与方差的计算结果(以Scalar类型返回)

运行代码可以得到彩色图像三通道的均值、方差和灰度图像单通道的均值、方差的输出结果。此时从输出结果中是无法得知图像到底有几个通道的,问题该如何解决呢?答案很简单,把调用meanStdDev函数的输出变量由Scalar类型改为Mat类型即可;修改如下:

改为:

再次运行代码,输出结果如图4-2所示。

由图4-2可以看到,彩色图像三通道输出计算结果也是3个通道各自的均值与方差,灰度图像单通道则是单个的均值与方差。所以在调用meanStdDev函数时建议使用Mat类型数据作为输出。

图4-2 均值与方差的计算结果(以Mat类型返回)

4.2 直方图的计算与绘制

图像直方图是图像的基本属性之一,也是图像像素数据分布的统计学特征。灰度图像像素的取值范围为[0, 255],可以通过直接计算得到直方图信息;而对于RGB三通道的彩色图像来说,每个通道单独计算得到的是每个通道的直方图信息。灰度图像的直方图计算方法如图4-3所示。

图4-3 灰度图像直方图计算示意图

图4-3中的(a)图代表的是灰度图像,(b)图代表的是对应的直方图信息,其中 X 轴表示像素的取值范围, Y 轴表示各个像素值出现的频次,即像素分布。由图4-3可以看到,像素值为0(黑色)时出现的次数是4次、像素值为65时出现的次数是6次、像素值为175时出现的次数是2次、像素值为255(白色)时出现的次数是4次。

对彩色图像来说,它有RGB三通道,因此首先需要对其完成通道分离操作,然后分别针对3个通道完成各自的像素值分布统计,最终得到3个通道的直方图信息,如图4-4所示。

图4-4中,绿色曲线、红色曲线和蓝色曲线分别对应于绿色通道、红色通道和蓝色通道的像素分布直方图。

图4-4 彩色图像三通道直方图(见彩插)

4.2.1 直方图计算

OpenCV中计算直方图、输出直方图统计信息的相关函数calcHist定义如下:

参数解释如下。

❑images:输入图像,一张或者多张,通道与类型一致。

❑nimages:输入图像的数目。

❑channels:不同图像的通道索引,编号从0开始。

❑mask:可选参数。

❑hist:输出直方图。

❑dims:必须是正整数,值不能大于CV_MAX_DIMS(当前版本是32)。

❑histSize:直方图大小,可以理解为 X 轴上的直方图的取值范围,假设取值范围为0~31,那么这32个级别会将灰度的256个(0~255)灰度级别分为32等份,又称为32个bin。

❑ranges:表示通道的取值范围,RGB的取值范围为0~256,HSV中H的取值范围为0~180。

❑uniform:表示一致性,对边界数据的处理方式,取值为false的时候表示不处理。

❑accumulate:表示对图像计算累积直方图。

如何使用该函数计算图像的直方图呢?首先需要定义一些基本的变量与常量,比如直方图的histSize、ranges和channels参数。定义如下:

加载一张灰度图像作为输入,完成对灰度图像的直方图计算,代码实现如下:

上述代码实现了单张图像单个通道的直方图计算,calcHist函数中两个1分别表示图像数目与图像通道,hist存储输出的直方图数据。

加载彩色图像作为输入,完成对彩色图像三个通道一维直方图的输出。代码实现如下:

首先,通过split函数把彩色图像分为3个单通道的灰度图像,然后完成与灰度图像类似的调用即可。

4.2.2 直方图绘制

1.一维直方图的绘制

因为OpenCV中没有专门的一维直方图的显示函数,所以需要读者自己实现一维数据的显示。首先创建一张黑色的空白图像,周围留50个像素作为边缘。因为屏幕坐标的原点在左上角,所以绘制图像也采用的是基于左上角为(0,0)的坐标信息。创建画布、计算每个bin之间距离的代码实现如下:

根据直方图数据绘制直方图曲线的代码实现如下:

首先需要根据画布的大小,对直方图数据完成归一化操作,把数据归一化到[0, hist_h],这样做主要是为了更好地显示曲线。分别计算三通道彩色图像各通道的直方图数据,进行相似的处理即可,得到的结果如图4-4所示。

2.多维直方图的绘制

有时候需要计算两个通道的直方图,生成一个2D的直方图平面。最常见的方法是先把图像从RGB色彩空间转换到HSV色彩空间,然后基于HSV色彩空间的H与S通道两个分量,分别计算直方图,生成2D直方图数据,最终得到一个直方图平面显示。代码实现如下:

相关参数的定义说明如下。H通道包含30个bin、S通道包含32个bin。H通道的取值范围为[0,180],S通道的取值范围为[0,256]。进行计算的直方图的维度参数设置如下:一维直方图为1、二维直方图为2。最终得到2D直方图,如图4-5所示。

图4-5 2D直方图

4.3 直方图均衡化

我们可以根据图像的像素分布生成直方图数据,假设我们对直方图数据进行相关的处理,改变像素数据的分布,再重新映射到原图,这样就改变了原图的像素分布与显示。因此,通过调整图像直方图数据,从而修改图像实现对比度调整,该操作称为直方图均衡化。图4-6显示的是OpenCV不同对比度图像的直方图分布结果。

图4-6 不同对比度增强方法的效果对比

从图4-6中可以看出:最左侧列(图4-6a)是输入图像,也是低对比度图像;左侧二列(图4-6b)为直接改变像素值获得对比度提升的图像;左侧三列(图4-6c)通过直方图均衡化完成了对比度提升;最右侧一列(图4-6d)也是通过直方图均衡化来完成的,不过是基于自适应直方图均衡化实现。

1.直方图均衡化

OpenCV中支持两种直方图均衡化的方法,分别如下。

(1)直方图均衡化(全局直方图均衡化)

直方图均衡化的函数定义如下:

其中,src表示输入参数,必须是CV_8U数据类型的单通道图像;dst表示输出图像,数据类型必须与输入图像的类型保持一致。相关的代码演示如下:

(2)对比度受限的自适应直方图均衡化

局部自适应直方图均衡化在OpenCV中对应于CLAHE(局部自适应直方图均衡化)类的实现,通过createCLAHE方法创建类实例之后,调用apply方法即可完成局部自适应直方图均衡化过程。代码实现如下:

在创建clahe变量时,输入的第一个参数2.0表示对比度阈值,默认值是40,此值越大,对比度越明显。该值主要是为了避免提升对比度导致的局部噪声放大效应;第二个参数表示网络大小,默认值是Size(8, 8),表示把输入图像分为多个8×8像素的网格。设置好参数,创建了clahe对象之后,直接调用apply方法即可完成直方图均衡化的操作。

2.彩色图像的直方图均衡化

上述两种直方图均衡化方法输入的是单通道图像,对于多通道的彩色图像来说,要想实现直方图均衡化操作又该怎么完成呢?结合前面所学的,很多读者首先想到的可能只是通过split函数将彩色图像转换为单通道图像数组,然后分别调用直方图均衡化方法进行均衡化操作,最后通过merge方法合并输出。这种解决问题的思路其实没有考虑图像色彩空间的影响与差异。通常的做法是,先把图像转换到HSV色彩空间,因为HSV色彩空间中V通道就是亮度分量,修改图像对比度的本质是调整亮度,所以只需要在HSV色彩空间先进行通道分离,分别得到H、S、V三个分量通道,然后对V通道分量进行直方图均衡化操作,最后再与H与S通道合并即可。代码演示如下:

基于局部自适应直方图均衡化的运行结果如图4-7所示。

图4-7 彩色图像直方图均衡化(见彩插)

在图4-7中,左侧是输入的原图,右侧是输出的均衡化之后的高对比度图像。

4.4 直方图比较

直方图比较是根据归一化之后的两个直方图数据进行的相似性比较,从而得到两幅图像之间的相似程度。直方图比较在早期的基于内容的图像检索(CBIR)中是很常见的技术手段,通常会结合边缘处理、词袋等技术一起使用。直方图信息是图像的统计学特征,但是该特征不具备唯一性。原因是图像本身的像素分布还包含了空间信息,而直方图统计只考虑了数据分布信息,很可能两张图像的直方图分布相似,但是内容完全不同,所以无法从根本上解决图像内容相似性比较的问题。但是在实际应用中,直方图比较对图像的初步筛选的效果还是很明显的。直方图比较的函数定义如下:

其中,H1与H2是两个直方图数据,method表示衡量直方图数据相似性的计算方法。当前method参数支持7种直方图相似性比较方法。

1)相关性相似比较(HISTCMP_CORREL)。

2)卡方相似比较(HISTCMP_CHISQR)。

3)交叉相似比较(HISTCMP_INTERSECT)。

4)巴氏距离相似比较(HISTCMP_BHATTACHARYYA)。

5)海林格距离相似比较(HISTCMP_HELLINGER),与巴氏距离相似比较一样。

6)可变卡方相似比较(HISTCMP_CHISQR_ALT)。

7)基于KL散度相似比较(HISTCMP_KL_DIV)。

在计算相似性的方法中,比较常用是巴氏距离相似比较与相关性相似比较。它们都支持一维、二维和三维的直方图数据比较,其公式参数和含义读者可自行了解。下面的代码演示的是图像直方图的相似性比较方法:

上面的演示代码实现了HISTCMP_CORREL、HISTCMP_CHISQR、HISTCMP_INTERSECT和HISTCMP_BHATTACHARYYA直方图相似比较方法。在进行直方图相似比较的时候,应先把图像转换到HSV色彩空间,这样做的好处是可以降低亮度干扰,然后对H与S通道进行计算,以生成2D直方图。最后调用直方图比较函数完成直方图相似性比较。对相关性相似比较与交叉相似比较方法来说,直方图数据相似性越低,值就越低;而对卡方相似比较与巴氏距离相似比较方法来说,直方图数据相似性越低,值就越高。其中巴氏距离相似比较方法的取值范围为[0, 1],0表示完全相同,1表示完全不同(不相似)。

注意: 直方图相似性比较的前提是要对直方图数据进行归一化处理。这里通过normalize函数实现,把数据归一化到[0, 1],然后进行比较。

4.5 直方图反向投影

OpenCV中直方图反向投影(Back Projection)算法的实现参考了论文“Indexing Via Color Histograms”,论文作者是Michael.J.Swain与Dana H.Ballard。论文分为两个部分:第一部分详细描述了颜色直方图的概念;第二部分通过颜色直方图交叉来实现对象鉴别。直方图反向投影算法可以实现的功能包括对象背景区分、在复杂场景中查找对象、不同光照条件的影响效果等。假设 M 表示模型直方图数据, I 表示图像直方图数据,直方图交叉匹配可以描述为如下公式:

其中, j 表示直方图的范围,即bin的个数。最终得到的结果表示的是有多少个模型的颜色像素与图像中的像素相同或者相似,值越大,表示越相似。归一化表示公式如下:

这种方法既可以让背景像素变换保持稳定性,又对尺度变换有一定的抗干扰作用。但是它无法实现尺度不变性特征。基于上述理论,两位作者发现通过该方法可以定位图像中已知物体的位置,他们称这个方法为直方图反向投影。正是因为直方图反向投影具备这样的能力,所以在经典的MeanShift与CAMeanShift跟踪算法中,直方图反向投影成为决定性因素之一。OpenCV中的直方图反向投影函数如下:

参数说明如下:

❑images:输入图像,一张或者多张,通道与类型一致。

❑nimages:输入图像的数目。

❑channels:不同图像的通道索引,编号从0开始。

❑hist:输入的模板直方图数据。

❑backProject:表示反向投影之后的输出。

❑ranges:表示通道的取值范围,RGB的取值范围为0~256,HSV中H的取值范围为0~180。

❑scale:表示对输出数据的放缩,1.0表示保持原值。

❑uniform:表示一致性,对边界数据的处理方式,取值为false表示不处理。

下面通过一个程序来演示直方图反向投影的应用,直方图反向投影可以通过特定的RoI区域,实现从全图中寻找RoI位置区域,然后输出一个掩膜图像的功能。代码实现如下:

上述代码中的image表示原图,tpl表示RoI区域。

运行结果如图4-8所示。

图4-8 直方图反向投影

直方图反向投影通常基于HSV色彩空间的H通道与S通道得到2D直方图来实现。原因是这类问题的图像RoI区域的色彩在HSV色彩空间通常能够更好地表达出来,反向投影的效果更好。

4.6 小结

本章主要介绍了图像直方图的基本概念、OpenCV中图像直方图的操作函数以及常见应用。在4.2节详细介绍了一维与二维直方图的计算和绘制方法,对灰度与彩色图像的不同直方图均衡化处理方法,以及直方图反向投影的应用实践与技巧等。 DAn2HbU0MXZT8ilW5TJ+oWtI/1shJ9VzqiLM1A28fcz9xbr7zC9org9/m8FKTMqc

点击中间区域
呼出菜单
上一章
目录
下一章
×