直方图就是对数据进行统计,将统计值组织到一系列事先定义好的 bin( 直方图中的柱子 ) 中。 bin 中的数值是从数据中计算出的特征的统计量,这些数据可以是诸如梯度、方向、色彩或任何其他特征。无论如何,直方图获得的是数据分布的统计图。
灰度图像的直方图的性质:
(1) 直方图是一幅图像中各像素灰度出现频次的统计结果,它只反映图像中不同灰度值出现的次数,而没反映某一灰度所在的位置。也就是说,它只包含了该图像的某一灰度像素出现的概率,而丢失了其所在的位置信息。
(2) 任一幅图像,都有惟一确定一幅与它对应的直方图,但不同的图像可能有相同的直方图。即图像与直方图之间是多对一的映射关系。
(3) 由于直方图是对具有相同灰度值的像素统计得到的,因此,一幅图像各子区的直方图之和就等于该图像全图的直方图。
通过直方图均衡化进行图像增强
直方图均衡化是灰度变换的一个重要应用,广泛应用在图像增强处理中,它是以累计分布函数变换为基础的直方图修正法,可以产生一幅灰度级分布具有均匀概率密度的图像,扩展了像素的取值动态范围。许多图像的灰度值是非均匀分布的 , 其中灰度值集中在一个小区间内的图像是很常见的,直方图均衡化是一种通过重新均匀地分布各灰度值来增强图像对比度的方法,经过直方图均衡化的图像对二值化阈值选取十分有利。一般来说,直方图修正能提高图像的主观质量 , 因此在处理艺术图像时非常有用。 直方图均衡化处理的中心思想是把原始图像的灰度直方图从比较集中的某个灰度区间变成在全部灰度范围内的均匀分布。
OpenCV2.4.4中提供了现成的直方图均衡化函数:
void equalizeHist(InputArray src, OutputArraydst );
实现代码如下:
//读入图像
Mat mat = imread("长虹大厦20120810.jpg");
Mat mergeImg;//合并后的图像
//用来存储各通道图片的向量
vector<Mat> splitBGR(mat.channels());
//分割通道,存储到splitBGR中
split(mat,splitBGR);
//对各个通道分别进行直方图均衡化
for(int i=0; i<mat.channels(); i++)
equalizeHist(splitBGR[i],splitBGR[i]);
//合并通道
merge(splitBGR,mergeImg);
结果:
原图
处理后
IplImage结构实现见下面这篇文章: