vlambda博客
学习文章列表

OpenCV之直方图处理

直方图处理

直方图是图像处理过程中的一种非常重要的分析工具。直方图从图像内部灰度级的角度对图像进行表述,包含十分丰富而重要的信息。从直方图的角度对图像进行处理,可以达到增强图像显示效果的目的。

直方图的含义

从统计的角度来说,直方图是图像内灰度值的统计特性与图像灰度值之间的函数,直方图统计图像内各个灰度级出现的次数。从直方图的图形上观察,横坐标是图像中各像素点的灰度级,纵坐标是具有该灰度级(像素值)得像素个数。
在OpenCV上,关于直方图的三个概念,DIMS,BINS,RANGE

  • DIMS,表示在绘制直方图时,收集的参数的数量。一般情况下,直方图中收集的数据只有一种,就是灰度级。因此,该值为1。

  • RANGE,表示要统计的灰度级范围,一般为[0,255],0对应的是黑色,255对应的是白色。

  • BINS,参数子集的数目。

绘制直方图

python的模块matplotlib.pyplot中的hist()函数能够方便地绘制直方图,我们采用该函数直接绘制直方图。除此以外,OpenCV中的cv2.clcHist()函数能够计算统计直方图,还可以在此基础上绘制图像的直方图。
此函数的作用是根据数据源和灰度级分组绘制直方图。其语法格式如下:
matplotlib.pyplot.hist(X,BINS)
式中,X为数据源,必须是一维的。图像是二维的,需要使用ravel()函数将图像处理为以为数据源以后在作为参数使用。BINS,它的具体值表示灰度级的分组情况。

使用OpenCV绘制直方图

       一、用cv2.calcHist()函数统计图像直方图信息
函数的语法为:
hist = cv2.calcHist( images, channels, mask, histSize, ranges, accumulate)
函数中参数的含义为:

  • hist,返回统计直方图,它是一个一维数组,数组内的元素是各个灰度级的像素个数。

  • images,原始图像。

  • channels,指定通道编号。

  • mask,掩模图像。

  • ranges,即像素值范围。

  • accumulate,累计标识。
    二、 plot()函数的使用
    使用matplotlib.pyplot模块内的plot()函数,可以将cv2.clcHist()的返回值绘制为图像直方图。
    三、绘制统计直方图
    使用plot()函数将函数cv2.calcHist()的返回值绘制为直方图。

使用掩模绘制直方图

在函数cv2.calcHist(),参数mask用于标识是否使用掩模图像。当使用掩模图像获取直方图时,仅获取掩模参数mask指定区域的直方图。
在绘制掩模图像时,首先将函数cv2.calcHist()的mask参数设置为掩模图像,得到掩模处理的直方图信息,再使用plot()函数完成直方图的绘制。

直方图均衡化

直方图均衡化的算法主要包括两个步骤:
(1)计算累计直方图
2)对累计直方图进行区间转换。

  • 在原有范围内实现均衡化:用当前灰度级的累计概率乘以当前灰度级的最大值7,得到新的灰度级,并作为均衡化的结果。

  • 在更广泛的范围内实现均衡化:用当前灰度级的累计概率乘以更广泛范围灰度级的最大值,得到新的灰度级,并作为均衡化的结果。