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