直方图就是对数据进行统计,将统计值组织到一系列事先定义好的bin(直方图中的柱子)中。bin中的数值是从数据中计算出的特征的统计量,这些数据可以是诸如梯度、方向、色彩或任何其他特征。无论如何,直方图获得的是数据分布的统计图。
灰度图像的直方图的性质:
(1) 直方图是一幅图像中各像素灰度出现频次的统计结果,它只反映图像中不同灰度值出现的次数,而没反映某一灰度所在的位置。也就是说,它只包含了该图像的某一灰度像素出现的概率,而丢失了其所在的位置信息。
(2) 任一幅图像,都有惟一确定一幅与它对应的直方图,但不同的图像可能有相同的直方图。即图像与直方图之间是多对一的映射关系。
(3) 由于直方图是对具有相同灰度值的像素统计得到的,因此,一幅图像各子区的直方图之和就等于该图像全图的直方图。
通过直方图均衡化进行图像增强
直方图均衡化是灰度变换的一个重要应用,广泛应用在图像增强处理中,它是以累计分布函数变换为基础的直方图修正法,可以产生一幅灰度级分布具有均匀概率密度的图像,扩展了像素的取值动态范围。许多图像的灰度值是非均匀分布的,其中灰度值集中在一个小区间内的图像是很常见的,直方图均衡化是一种通过重新均匀地分布各灰度值来增强图像对比度的方法,经过直方图均衡化的图像对二值化阈值选取十分有利。一般来说,直方图修正能提高图像的主观质量,因此在处理艺术图像时非常有用。直方图均衡化处理的中心思想是把原始图像的灰度直方图从比较集中的某个灰度区间变成在全部灰度范围内的均匀分布。
OpenCV中提供了现成的直方图均衡化函数:void cvEqualizeHist( const CvArr* src, CvArr* dst );
实现如下:
IplImage * pImage = cvLoadImage("长虹大厦20120810.jpg", 1);//原始图像 IplImage * pMergeImage = cvCreateImage(cvGetSize(pImage),pImage->depth,pImage->nChannels);//处理后的图像 IplImage * pImageChannel[4] = {0,0,0,0};//分别保存4个通道的灰度图像 //创建各个灰度图像 for(int i=0; i<pImage->nChannels; i++) pImageChannel[i] = cvCreateImage(cvGetSize(pImage),pImage->depth,1); //分割通道 cvSplit(pImage,pImageChannel[0],pImageChannel[1],pImageChannel[2],pImageChannel[3]); //对每个信道分别做直方图均衡化 for(i=0; i<pImage->nChannels; i++) cvEqualizeHist(pImageChannel[i],pImageChannel[i]); //合并通道 cvMerge(pImageChannel[0],pImageChannel[1],pImageChannel[2],pImageChannel[3],pMergeImage); cvNamedWindow("原始图像",1); cvNamedWindow("处理后的图像",1); cvShowImage("原始图像",pImage); cvShowImage("处理后的图像",pMergeImage);
处理前:
处理前图像的直方图:
处理后:
处理后图像的直方图:
可以看到处理后图像的直方图分布扩散了,说明色彩分布更宽广了,不集中在一起了。
源码下载:
http://download.csdn.net/detail/masikkk/4499482