您的位置:首页 > 其它

对比度受限的自适应直方图均衡化(CLAHE)

2015-11-02 14:10 337 查看
直方图均衡化(HE)是一种很常用的直方图类方法,基本思想是通过图像的灰度分布直方图确定一条映射曲线,用来对图像进行灰度变换,以达到提高图像 对比度的目的。该映射曲线其实就是图像的累计分布直方图(CDF)(严格来说是呈正比例关系)。然而HE是对图像全局进行调整的方法,不能有效地提高局部 对比度,而且某些场合效果会非常差。如:

for (Y = 0; Y <= TileY; Y++) //TileY为Y方向网格数
{
if (Y == 0)
{
SubY = TileYDim >> 1;  YU = 0; YB = 0;
}
else if (Y == TileY)
{
SubY = TileYDim >> 1;    YU = TileY-1;  YB = YU;
}
else
{
SubY = TileYDim; YU = Y - 1; YB = Y;
}
for (X = 0; X <= TileX; X++) //TileX为X方向网格数
{
if (X == 0)
{
SubX = TileXDim >> 1; XL = 0; XR = 0;
}
else if (X == TileX)
{
SubX = TileXDim >> 1;  XL = TileX - 1; XR = XL;
}
else
{
SubX = TileXDim; XL = X - 1; XR = X;
}
MapLU = &pMapArray[numBins * (YU * TileX + XL)];//左上角映射函数
MapRU = &pMapArray[numBins * (YU * TileX + XR)];//右上角映射函数
MapLB = &pMapArray[numBins * (YB * TileX + XL)];//左下角映射函数
MapRB = &pMapArray[numBins * (YB * TileX + XR)];//右下角映射函数
Interpolate(pImPointer,Stride,Channel,MapLU,MapRU,MapLB,MapRB,SubX,SubY,aLUT);//插值
pImPointer += SubX;
}
pImPointer+=(SubY-1)*Stride;
}


View Code

注意的是,上述循环需要(TileX+1)*(TileY+1)次,而不是TileX*TileY次。,原因很简单,以X方向为例,两侧边界处的半宽子块(灰色区)也各需要处理一次,如下图:



通过双线性插值可以基本消除块状效应:




于彩色图像,三通处理分开处理会导致严重的偏色,故我们可以将其进行颜色空间转换(如RGB转为HSV),然后仅对亮度分量处理,再反变换回RGB空间。
不过网上有高手将R、G、B统一处理[2](也就相当于把一个像素点拆成三个像素点),这样得到的效果也不错,而且省去了颜色空间转换的时间,我们这里也
仿照他来吧:



另外,CLAHE对雾天图像处理效果也不错:







至于编程,我基本就是翻译adaphisteq.m,另外还有一些参考资源:CLAHE代码(MATLAB)

这里给出编译好的文件,有兴趣的朋友可以下载看看:ImageProcess(CLAHE)

参考:

[1]https://en.wikipedia.org/wiki/Adaptive_histogram_equalization

[2]/content/3795664.html
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: