图像增强算法之限制对⽐度⾃适应直⽅图均衡化算法原理
⼀、⾃适应直⽅图均衡化(Adaptive histgram equalization/AHE)
1.简述
⾃适应直⽅图均衡化(AHE)⽤来提升图像的对⽐度的⼀种计算机图像处理技术。和普通的直⽅图均衡不同,AHE算法通过计算图像的局部直⽅图,然后重新分布亮度来来改变图像对⽐度。因此,该算法更适合于改进图像的局部对⽐度以及获得更多的图像细节。
不过,AHE有过度放⼤图像中相同区域的噪⾳的问题,另外⼀种⾃适应的直⽅图均衡算法即限制对⽐度直⽅图均衡(CLAHE)算法能有限的限制这种不利的放⼤。
2. 算法的解释
普通的直⽅图均衡算法对于整幅图像的像素使⽤相同的直⽅图变换,对于那些像素值分布⽐较均衡的图像来说,算法的效果很好。然后,如果图像中包括明显⽐图像其它区域暗或者亮的部分,在这些部分的对⽐度将得不到有效的增强。
AHE算法通过对局部区域执⾏响应的直⽅图均衡来改变上述问题。该算法⾸先被开发出来适⽤于改进航
天器驾驶舱的显⽰效果。其最简单的形式,就是每个像素通过其周边⼀个矩形范围内的像素的直⽅图进⾏均衡化。均衡的⽅式则完全同普通的均衡化算法:变换函数同像素周边的累积直⽅图函数(CDF)成⽐例。
图像边缘的像素需要特殊处理,因为边缘像素的领域不完全在图像内部。这个通过镜像图像边缘的⾏像素或列像素来解决。直接复制边缘的像素进⾏扩充是不合适的。因为这会导致带有剑锋的领域直⽅图。
3. AHE的属性
领域的⼤⼩是该⽅法的⼀个参数。领域⼩,对⽐度得到增强,领域⼤,则对⽐度降低。
当某个区域包含的像素值⾮常相似,其直⽅图就会尖状化,此时直⽅图的变换函数会将⼀个很窄范围内的像素映射到整个像素范围。这将使得某些平坦区域中的少量噪⾳经AHE处理后过度放⼤。
⼆、限制对⽐度⾃适应直⽅图均衡(Contrast Limited Adaptive histgram equalization/CLAHE)
  1.简述
CLAHE同普通的⾃适应直⽅图均衡不同的地⽅主要是其对⽐度限幅。这个特性也可以应⽤到全局直⽅
图均衡化中,即构成所谓的限制对⽐度直⽅图均衡(CLHE),但这在实际中很少使⽤。在CLAHE中,对于每个⼩区域都必须使⽤对⽐度限幅。CLAHE主要是⽤来克服AHE 的过度放⼤噪⾳的问题。
这主要是通过限制AHE算法的对⽐提⾼程度来达到的。在指定的像素值周边的对⽐度放⼤主要是由变换函数的斜度决定的。这个斜度和领域的累积直⽅图的斜度成⽐例。CLAHE通过在计算CDF前⽤预先定义的阈值来裁剪直⽅图以达到限制放⼤幅度的⽬的。这限制了CDF的斜度因此,也限制了变换函数的斜度。直⽅图被裁剪的值,也就是所谓的裁剪限幅,取决于直⽅图的分布因此也取决于领域⼤⼩的取值。
通常,直接忽略掉那些超出直⽅图裁剪限幅的部分是不好的,⽽应该将这些裁剪掉的部分均匀的分布到直⽅图的其他部分。如下图所⽰。
这个重分布的过程可能会导致那些倍裁剪掉的部分由重新超过了裁剪值(如上图的绿⾊部分所⽰)。如果这不是所希望的,可以不带使⽤重复不的过程指导这个超出的部分已经变得微不⾜道了。
2. 通过插值加快计算速度
如上所述的直接的⾃适应直⽅图,不管是否带有对⽐度限制,都需要对图像中的每个像素计算器领域直⽅图以及对应的变换函数,这使得算法及其耗时。
⽽插值使得上述算法效率上有极⼤的提升,并且质量上没有下降。⾸先,将图像均匀分成等份矩形⼤⼩,如下图的右侧部分所⽰(8⾏8列64个块是常⽤的选择)。然后计算个块的直⽅图、CDF以及对应的变换函数。这个变换函数对于块的中⼼像素(下图左侧部分的⿊⾊⼩⽅块)是完全符合原始定义的。⽽其他的像素通过哪些于其临近的四个块的变换函数插值获取。位于图中蓝⾊阴影部分的像素采⽤双线性查插值,⽽位于便于边缘的(绿⾊阴影)部分采⽤线性插值,⾓点处(红⾊阴影处)直接使⽤块所在的变换函数。
这样的过程极⼤的降低了变换函数需要计算的次数,只是增加了⼀些双线性插值的计算量。
CLAHE算法的源代码参考:
View Code
上⾯的代码中对于各块之间的插值部分的编码技巧很值得学习和参考。
Karel Zuiderveld提供的代码:
View Code
应该修正为: View Code
同时,各位也可以参考下matlab 的adapthisteq.m ⽂件,该⽂件的代码基本是严格按照 Karel Zuiderveld 作者的原⽂写的,贴出如下: View Code
参考上述代码,我分别⽤VB 和C#实现了该算法,提供个编译好的⽂件给有兴趣研究该算法的朋友看看效果(不提供源代码的):      截⾯如下:
其中AHE 算法可以认为是裁剪限幅为1的CLAHE 算法,CLHE 是⽔平⽹格和垂直⽹格都为1的算法。
均衡分布⽅式和ALPHA 的解释可参考matlab 的代码.
CLAHE 算法很多时候⽐直接的直⽅图均衡化算法的效果要好很多,⽐如:
原始图像                                                        普通的直⽅图均衡化                                                  CALHE
可以看出,在图像的上部,CALHE 有效的抑制了噪⾳的增强。
再举⼀些例⼦看看效果
原始图像                                                        普通的直⽅图均衡化                                                  CALHE
原始图像                                                        普通的直⽅图均衡化                                                  CALHE
原始图像                                                        普通的直⽅图均衡化                                                  CALHE
对于彩⾊图像,matlab 的那个函数不⽀持,我这⾥采⽤了两种⽅式处理,⼀种是各通道分开处理,⼀种是每个通道都放在⼀起,对于彩⾊的图像似乎放在⼀起处理的效果要⽐分开处理好很多。
⽐如界⾯中那个图像,如果各通道放在⼀起处理,效果如下:
⽽通道分开处理,则各通道的颜⾊不很匹配:
对于处理速度,这个函数由于只有⼀些分开+插值计算,速度很快。如果图像不能倍分成整块,⼀般需要扩充边缘,matlab的处理⽅式是上下左右四条边对称镜像扩充。这种⽅式很合理。
实例⼯程是⽤VB6编写的,由于VB不⽀持指针,在速度⽐C#之类的语⾔⼤概慢了50%左右。但是也还是很快的了。
2013.10.20 补充
这个函数的编码是需要⼀定的时间和能⼒的,为此,我⽤C++编制了⼀个DLL,并⽤C#给出了调⽤的过程,供有需要的朋友使⽤。局部直方图均衡化
[DllImport("AdaptHistEqualize.dll", CallingConvention = CallingConvention.StdCall, CharSet = CharSet.Unicode, ExactSpelling = true)]
private static extern void AdaptHistEqualize(byte *Scan0, int Width, int Height, int Stride,int TileX , int TileY , double CutLimit, bool SeparateChannel);

版权声明:本站内容均来自互联网,仅供演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系QQ:729038198,我们将在24小时内删除。