循序渐进之(四)空间域图像增强之自适应对比度增强(ACE)

                           循序渐进之(四)空间域图像增强之自适应对比度增强(ACE)

 

文字摘自:使用局部标准差实现图像的局部对比度增强算法。

ACE算法采用了反锐化掩模技术,我们对此过程解释如下:首先图像被分成两个部分。一是低频的反锐化掩模(unsharp mask)部分,可以通过图像的低通滤波(平滑,模糊技术)获得。二是高频成分,可以过原图减去反锐化掩模获取。然后高频部分被放大(放大系数即为对比度增益CG)并加入到反锐化掩模中去,最后得到增强的图像。ACE算法的核心就是如何计算CG,这里将介绍两种简单的CG计算方法。

             在谈及CG之前,我们还是需要看看一些基础的工作。首先上面谈到了unsharp mask,他对应于图像的低频成分。对于具体的像素,一般可以通过计算以该像素为中心的局部区域的像素平均值来实现。我们假定x(i,j)是图像中某点的灰度值,局部区域的定义为:以(i,j)为中心,窗口大小为(2n+1)*(2n+1)的区域,其中n为一个整数。当然这个窗口区域也不一定就要是正方形。局部的平均值,也就是低频部分,可以用下式计算:

                                                         

              而局部方差为:

                                        

             上式中σx(i,j)就是所谓的局部标准差(LSD)。定义f(i,j)表示x(i,j)对应的增强后的像素值。则ACE算法可以表示如下:

                                                    

              其中的函数G(i,j)就是上文所讲的CG。一般情况下CG总是大于1的,这样高频成分就能得到增强。

     关于CG的取值,一种最简单的方式就是令其为常量,假定为C,一般C>1,这样式3就变为:

                                                        

              一种解决的方案就是使用不同的增益。Lee等人提出了如下的方案:

                                                

             上式中,D是个常数,这样,CG是空间自适应的,并且和局部均方差成反比,在图像的边缘或者其他变化剧烈的地方,局部均方差比较大,因此CG的值就比较小,这样就不会产生振铃效应。然而,在平滑的区域,局部均方差就会很小,这样CG的值比较大,从而引起了噪音的放大,所以需要对CG的最大值做一定的限制才能获得更好的效果。D这个常数的取值有些文章介绍说用图像的全局平均值。

            后续增加:文字摘自:反锐化掩模(unsharp masking )

线性反锐化掩模(UnSharp Masking,UM)算法。首先将原图像低通滤波后产生一个钝化模糊图像,将原图像与这模糊图像相减得到保留高频成份的图像,再将高频图像用一个参数放大后与原图像叠加,这就产生一个增强了边缘的图像。最初将原图像通过低通滤波器后,因为高频成份受到抑制,从而使图像模糊,所以模糊图像中高频成份有很大削弱。将原图像与模糊图像相减的结果就会使f(x、y)的低频成份损失很多,而高频成份较完整地被保留下来。因此,再将高频成份的图像用一个参数放大后与原图像f(x、y)叠加后,就提升了高频成份,而低频成份几乎不受影响。(这个相当于ACE中的恒值增强。。)

             程序参考:自适应对比度增强(ACE)算法原理及实现

#include<iostream>
#include<opencv.hpp>
using namespace std;
using namespace cv;
int main()
{
	int n = 7;
	int C = 5;
	int Max = 8;
	Mat originImage = imread("E://匹配.jpg", 0);
	
	Mat meanLocal;//局部均值
	Mat varLocal;//局部方差
	Mat meanTotal;//总体均值
	Mat varTotal;//总体方差
	Mat highFre;//高频局域
	Mat varSingle;//单个像素的高频平方差
	Mat sdLocal(originImage.size(),originImage.type());//局部标准差
	Mat a;
	Mat b;
	blur(originImage.clone(), meanLocal, Size(n, n));//计算局部区域的平均值,公式(1)
	highFre = originImage - meanLocal;//计算高频区域
	varSingle = highFre.mul(highFre);//这里一开始没看明白,点乘完后是单个像素高频区域的平方,下一步blur后才是公式中的局部方差
	blur(varSingle, varLocal, Size(n, n));//局部方差,公式(2)
	a = meanLocal + C*highFre;//第一种增强方式,这里叫做恒值增强,公式(4)
	varLocal.convertTo(varLocal, CV_32F);
	sdLocal.convertTo(sdLocal, CV_32F);
	for (int i = 0; i <varLocal.rows; i++) 
	{
		for (int j = 0; j < varLocal.cols; j++)
		{
			sdLocal.at<float>(i, j) = (float)sqrt(varLocal.at<float>(i, j));//局部标准差
		}
	}

	meanStdDev(originImage.clone(), meanTotal, varTotal);
	Mat gainArr = 0.5 * meanTotal/ sdLocal;//增益系数矩阵  ,,公式(5)中的常数D,,

	for (int i = 0; i < varLocal.rows; i++)
	{
		for (int j = 0; j < varLocal.cols; j++)
		{
			if (gainArr.at<float>(i, j) > Max) 
			{
				gainArr.at<float>(i, j) = Max;
			}
		}
	}//对增益矩阵进行区间限制  
	gainArr.convertTo(gainArr, CV_8U);
	gainArr = gainArr.mul( highFre);
        b = meanLocal + gainArr;//第二种增强方式,这里叫做变增益增强,公式(5)
	imshow("原图", originImage);
	imshow("恒值增强", a);
	imshow("变增益增强", b);
	waitKey(0);
	return 0;
}

效果如下:

猜你喜欢

转载自blog.csdn.net/coming_is_winter/article/details/88251331