直方图均衡

直方图这个东西,是个好东西。所谓的直方图,就是统计这个图像当中intensity的分布状况。直方图在图像处理当中的用处仍是挺大的。函数

这里咱们说一下直方图的均衡问题。blog

首先,为何要进行直方图均衡?数学

咱们知道,在RGB色彩系统中,咱们能够经过一个公式,将RGB色彩图像转换为灰度图像,这个公式就是Gray = R*0.299 + G*0.587 + B*0.114。经过这个公式,咱们就能对图像中intensity有一些了解:若是一个像素点的RGB三色都比较大,那么这个像素的色彩应当是偏向于白色的,他的intensity也会增大,RGB三色都比较小的时候,像素色彩偏向于黑色,intensity也会较暗。虽然RGB三色的不一样组合表明了不一样的颜色,可是,咱们这里只考虑RBG三色根据上面公式所获取的单一的数值大小,而这个数值大小也就是灰度值。咱们对于intensity的调整不会影响图像的形状和构造。固然,因为这个公式属于三元一次方程,解不肯定,所以,这个过程不可逆,也就是说,想要进行彩色图案的色彩均衡,须要另一种办法。it

既然是直方图的均衡,咱们能够认为是图像intensity的均衡。咱们使用的均衡方法的步骤是:图像处理

一、统计各个intensity级数的像素个数,求出intensity级数像素数目所占全部像素的比例。class

二、根据不一样的intensity级数咱们分配不一样的数值。方法

咱们之因此这么作的缘由是:im

使用上面的步骤的缘由为:一个图像中的intensity级数分布是没有规律的,咱们之因此要进行直方图均衡,是由于他可以加强图像的对比图,提高图像的表现。第一步经过求出各个intensity的级数所占的比例,就可以得出哪一个intensity级数占的比例更大,哪一个更小。将比例做为权重,且intensity级数越大,显示效果更好。这就是用数学方法将占比例小的intensity级数滤去。统计

假如咱们有以下数据:1,2,2,2,2,2,2,3,3,3,,4,4,4,,5。咱们能够看到,这些数中,1,5的数量最少,2最多,其次是3,4。根据比例,1,5所占比例最小,2最多。因此,2在这个数列中的权重最大,1,5最小;放到图像中亦然。数据

代码以下

        int count=0;
	double *p=new double[256];
	double *per=new double[256];
	for(int i=0;i!=256;++i)
		p[i]=0;
	int *arr=new int[256];
	for(int i=0;i!=256;++i)
		arr[i]=0;

        for(int i=0;i!=in.rows;++i)
	for(int j=0;j!=in.cols;++j)
	arr[in.at<uchar>(i,j)]++;

	for(int i=0;i!=256;++i)
	per[i]=double(arr[i])/double(in.cols*in.rows);

	for(int i=0;i!=256;++i)
	for(int j=i;j>=0;--j)
	p[i]+=per[j];

	for(int i=0;i!=in.rows;++i)
	for(int j=0;j!=in.cols;++j)
	in.at<uchar>(i,j)=uchar(255*p[in.at<uchar>(i,j)]);

  这个方法的效果,和OpenCV提供的函数的效果差异不大。这个方法能够明显的提高图像的对比度,如图所示

这是原图转灰度以后的图像,咱们只能依稀看到这是个什么东西,对比度实在堪忧。让咱们看一下直方图均衡化以后的效果:

对比度确实高了很多,这个效果咱们仍是能够接受的。

相关文章
相关标签/搜索