基于局部均方差的图像局部对比度增强算法
1.基于局部均方差增强原理
我们知道图像的高频部分代表的是图像中类似边缘的高频分量;底频部分代表的是图像中较为平坦的部分。假若用原始图像减去图像中低频部分的,那么得到的就是图像的高频分量。这个方法和直接把原始图像通过高通滤波的方式得到的图像相一致,最后都是得到图像的高频部分。而这一部分我们可以适当的进行增强,是图像变得较为清晰。但是需要控制高频增强的程度,否则会带来溢出的效果或者导致图像一些部分不平滑,出现褶皱。
如何获取高频增强系数是最为关键的步骤。假设一幅M*N大小的灰度图像,窗口大小为(2*n+1)(2*m+1),则我们可以计算图像的局部平均值作为图像的低频分量:
局部方差为:
定义输出图像f(I,j)为增强之后的图像,其增强算法表示为:
G(i,j)为增强控制系数。X(i,j)-m(i,j)为高频分量。最简单的增强系数即设定为常量C。即
C>1,当一般不能太大,传统值为2或3..这种情况下高频部分都被同等放大,可能有些高频部分会出现过增强的现象的。
为了避免出现过增强的现象,JONG-SEN LEE提出了一种改进的方法。如下公式所示:
其增强系数与局部方差相关。局部方差较大,说明是图像的高频部分,增强系数比较小;局部方差较小,说明是图像的低频部分,增强系数比较大,引起了噪音的放大,所以需要对CG的最大值做一定的限制才能获得更好的效果。也即对图像的高频部分和低频部分做不同的处理,以达到图像的增强效果。D一般取整幅图像的平均值,也可以是全局均方值。
2.基于局部均方差增强代码实现
关键代码:
GobalSum = 0;
GobalMean = 0;
GobalSum2 = 0;
GobalVar = 0;
for(x = 0; x< height;x++)
{
for(y = 0;y < width;y++)
{
index = x*lineByte+y;
GobalSum += img_data[index];
GobalSum2 += img_data[index]*img_data[index];
}
}
GobalMean = GobalSum/(height*width);
GobalVar = (GobalSum2-(GobalSum*GobalSum)/(width*height))/(height*width);
for(x = SIZE/2; x< height-SIZE/2;x++)
{
for(y = SIZE/2;y < width-SIZE/2;y++)
{
Sum = 0;
Mean = 0;
Sum2 = 0;
index = x*lineByte+y;
for(i = -SIZE/2;i<= SIZE/2;i++)
{
for(j = -SIZE/2;j<=SIZE/2;j++)
{
Sum += img_data[index+i*lineByte+j];
Sum2 += img_data[index+i*lineByte+j]*img_data[index+i*lineByte+j];
}
}
Mean = Sum/size;
Var = (Sum2-(Sum*Sum)/size)/size;
CG = GobalVar/Var;
if(CG > 4)
CG = 4;
img_data[index] = CLIP255((int)(Mean + (CG)*(img_data[index]- Mean)));
}
}
3.图像效果
左侧图像为原始图像,右侧图像为增强系数CG=3时的结果。
参考资料:
http://www.cnblogs.com/Imageshop/p/3324282.html