我是靠谱客的博主 听话金针菇,最近开发中收集的这篇文章主要介绍彩色直方图均衡化,觉得挺不错的,现在分享给大家,希望可以做个参考。

概述

直方图均衡化(其实是求助帖~~

直方图均衡化是通过灰度变换将一幅图像转换为另一幅具有均衡直方图,即在每个灰度级上都具有相同的象素点数过程。使用该方法可以加强图像的局部对比度,尤其是当图像的有用数据的对比度相当接近的时候。通过这种方法,亮度可以更好的在直方图上分布。

直方图均衡化的基本思想是把原始图像的直方图变换为均匀分布的形式。这样增加了灰度值的动态范围,从而达到增强图像整体对比度的效果。

算法步骤:

1)计算图像f(x,y)的各灰度级中像素出现的概率p(i)。(L是图像中可能的灰度级数量,对8bit图像是256)

                  

2) 计算p的累计概率函数c(i),c即为图像的累计归一化直方图。

                  

3)将c(i)缩放至0~255范围内。

                  

在C++中实现该函数:

void EqualizeHist(IplImage* src)
{
	double p[256],num[256];
	double sum=0;
	memset(num,0,sizeof(num));//数组清零
	memset(p,0,sizeof(p));
	for (int i=0;i<src->height;i++)
	{
		for (int j=0;j<src->width;j++)
		{
			int d=cvGetReal2D(src,i,j);//d=(src1->imageData+src1->widthStep*i)[j];
			num[d]++;
		}
	}
	p[0] = num[0]/(src->height * src->width);
	for(int i=1;i<256;i++)
	{
		p[i] = num[i]/(src->height * src->width) + p[i-1];
	}		
	for (int i=0;i<src->height;i++)
	{
		for (int j=0;j<src->width;j++)
		{
			int d=cvGetReal2D(src,i,j);
			cvSetReal2D(src,i,j,p[d]*255);
		}
	}
}

OpenCV中有灰度直方图均衡化的函数cvEqualizeHist。函数原型:

void cvEqualizeHist( const CvArr* src, CvArr* dst );

在cvEqualizeHist()中,原始图像及目标图像必须是单通道,大小相同的8位图像。所以对于彩色图像,必须先将每个通道分开,再分别进行处理。即对图像R、G和B三个通道分别进行直方图均衡化处理,使每个通道的直方图都能在所有灰度级上均匀分布。

opencv中实现代码如下:

int main()  
{  
    IplImage *image= cvLoadImage("lena.jpg");       
    IplImage *eqlimage=cvCreateImage(cvGetSize(image),image->depth,3);  
    
    //将图像分成RGB三通道
    IplImage* RedImage=cvCreateImage(cvGetSize(image),image->depth,1);  
    IplImage* GreenImage=cvCreateImage(cvGetSize(image),image->depth,1);  
    IplImage* BlueImage=cvCreateImage(cvGetSize(image),image->depth,1);  
    cvSplit(image,BlueImage,GreenImage,RedImage,NULL);  
  
    //分别均衡化每个通道 
    cvEqualizeHist(RedImage,RedImage);      
    cvEqualizeHist(GreenImage,GreenImage);
    cvEqualizeHist(BlueImage,BlueImage);       
    //均衡化后的图像      
    cvMerge(BlueImage,GreenImage,RedImage,NULL,eqlimage);     
    cvNamedWindow("image", CV_WINDOW_AUTOSIZE);
    cvShowImage("image", eqlimage);   
    cvDestroyWindow("image");
    cvReleaseImage(&image);
    cvReleaseImage(&eqlimage);
}  


原始图片及直方图均衡化效果




对于有的图片处理效果很好,但是对于有些图片会产生很多噪声,这也是我比较纠结的地方。有没有人遇到过一样的情况? Help~~~

是不是与图像质量有关?但是我处理用单反拍的图片的时候一样会出现很多噪声。见下面的白平衡色卡。


最后

以上就是听话金针菇为你收集整理的彩色直方图均衡化的全部内容,希望文章能够帮你解决彩色直方图均衡化所遇到的程序开发问题。

如果觉得靠谱客网站的内容还不错,欢迎将靠谱客网站推荐给程序员好友。

本图文内容来源于网友提供,作为学习参考使用,或来自网络收集整理,版权属于原作者所有。
点赞(43)

评论列表共有 0 条评论

立即
投稿
返回
顶部