论文:Contrast limited adaptive histogram equalization
Zuiderveld, Karel. "Contrast limited adaptive histogram equalization." Graphics gems IV. Academic Press Professional, Inc., 1994.
目录
一、背景
1、对比度和直方图均衡HE
“对比度contrast ratio”这一概念,类似于“动态范围dynamic range”,衡量的是图像中亮区与暗区的比例。
对比度实际上没有统一的测量标准,但我们知道,对比度是影响图像视觉效果的重要因素,对比度小的图像,其色彩层次少,看起来要么太亮,要么太暗。
直方图均衡的本质是灰度值映射。而映射函数可以由分布曲线(累积直方图)得到:
其中 A0是像素总数(图像面积),Dmax是最大灰度值,DA、DB分别是转换前、后的灰度值,Hi 是第 i 级灰度的像素个数。
例如原直方图为:
-
灰度值0到120,累积像素个数都为0,因此灰度值0到120都映射到灰度值0;
-
此后黑线开始上升,其纵坐标就是映射到的灰度值(当然还有系数 DmaxA0DmaxA0 )。
-
灰度值200左右,黑线饱和,因此其后的灰度值都映射到最大灰度值255。
经过均衡后的直方图为:
综上,HE后的直方图实际上是原直方图的拉伸,只是左右拉伸程度是变化的,取决于原直方图的幅度变化。
2、HE的问题
以上是直方图均衡Histogram Equalization的简单应用。事实上,HE最初用在医疗图像上。但是会同时增强噪声。
3、AHE
1)简述
在CLAHE提出以前,学者还提出了自适应直方图均衡Adaptive Histogram Equalization。自适应直方图均衡化(AHE)用来提升图像的对比度的一种计算机图像处理技术。和普通的直方图均衡算法不同,AHE算法通过计算图像的局部直方图,然后重新分布亮度来来改变图像对比度。因此,该算法更适合于改进图像的局部对比度以及获得更多的图像细节。
AHE的思想很简单:为了改善局部对比度,我们采用块操作。此时HE在每一个块上都会最优,从而实现各个局部最优。进一步,为了避免边界效应,我们组合块时采用双线性插值法,而不是简单的合并。
2)算法的解释
普通的直方图均衡算法对于整幅图像的像素使用相同的直方图变换,对于那些像素值分布比较均衡的图像来说,算法的效果很好。然后,如果图像中包括明显比图像其它区域暗或者亮的部分,在这些部分的对比度将得不到有效的增强。
AHE算法通过对局部区域执行响应的直方图均衡来改变上述问题。该算法首先被开发出来适用于改进航天器驾驶舱的显示效果。其最简单的形式,就是每个像素通过其周边一个矩形范围内的像素的直方图进行均衡化。均衡的方式则完全同普通的均衡化算法:变换函数同像素周边的累积直方图函数(CDF)成比例。
图像边缘的像素需要特殊处理,因为边缘像素的领域不完全在图像内部。这个通过镜像图像边缘的行像素或列像素来解决。直接复制边缘的像素进行扩充是不合适的。因为这会导致带有剑锋的领域直方图。
3) AHE的属性
- 领域的大小是该方法的一个参数。领域小,对比度得到增强,领域大,则对比度降低。
- 当某个区域包含的像素值非常相似,其直方图就会尖状化,此时直方图的变换函数会将一个很窄范围内的像素映射到整个像素范围。这将使得某些平坦区域中的少量噪音经AHE处理后过度放大。
根据实验结果,AHE在目标区域表现比HE更出色, AHE有过度放大图像中相同区域的噪音的问题,即,底噪问题仍然没有解决。另外一种自适应的直方图均衡算法即限制对比度直方图均衡(CLAHE)算法能有限的限制这种不利的放大。
4、底噪问题
底噪问题的本质:大斜率导致低灰度值映射到高灰度值,使原本集中的黑色背景“点亮”。
不妨考虑极端情况。假设原直方图中只有一个柱子,对应灰度值为0。这就是说,这本应该是一个全黑的块。
然而,根据HE原理,由于灰度值0处的 DB=255 ,因此灰度值0的柱子变成了灰度值255的柱子,整幅图像变成了全1阵(为什么是1不是255?这里涉及到MATLAB图像格式的问题,不赘述)。即,全黑图像变成了全白图像。
因此,我们应该限制分布函数cumulative distribution function的斜率。
二、CLAHE
1.简述
CLAHE同普通的自适应直方图均衡不同的地方主要是其对比度限幅。这个特性也可以应用到全局直方图均衡化中,即构成所谓的限制对比度直方图均衡(CLAHE),但这在实际中很少使用。在CLAHE中,对于每个小区域都必须使用对比度限幅。CLAHE主要是用来克服AHE的过度放大噪音的问题。
这主要是通过限制AHE算法的对比提高程度来达到的。在指定的像素值周边的对比度放大主要是由变换函数的斜度决定的。这个斜度和领域的累积直方图的斜度成比例。CLAHE通过在计算CDF前用预先定义的阈值来裁剪直方图以达到限制放大幅度的目的。这限制了CDF的斜度。因此,也限制了变换函数的斜度。直方图被裁剪的值,也就是所谓的裁剪限幅,取决于直方图的分布因此也取决于领域大小的取值。
通常,直接忽略掉那些超出直方图裁剪限幅的部分是不好的,而应该将这些裁剪掉的部分均匀的分布到直方图的其他部分。如下图所示。
这个重分布的过程可能会导致那些被裁剪掉的部分由重新超过了裁剪值(如上图的绿色部分所示)。如果这不是所希望的,可以不带使用重复不的过程指导这个超出的部分已经变得微不足道了。
2. 通过插值加快计算速度
如上所述的直接的自适应直方图,不管是否带有对比度限制,都需要对图像中的每个像素计算器领域直方图以及对应的变换函数,这使得算法及其耗时。
而插值使得上述算法效率上有极大的提升,并且质量上没有下降。首先,将图像均匀分成等份矩形大小,如下图的右侧部分所示(8行8列64个块是常用的选择)。然后计算
- 每个块的直方图;
- CDF;
- 以及对应的变换函数。
这个变换函数对于
- 块的中心像素(下图左侧部分的黑色小方块)是完全符合原始定义的。
- 而其他的像素通过那些与其临近的四个块的变换函数插值获取。
- 位于图中蓝色阴影部分的像素采用双线性查插值;
- 而位于便于边缘的(绿色阴影)部分采用线性插值;
- 角点处(红色阴影处)直接使用块所在的变换函数。
这样的过程极大的降低了变换函数需要计算的次数,只是增加了一些双线性插值的计算量。
3、算法格式和细节
原作中给出的是C语言程序实现。这里我们研究MATLAB内置函数adapthisteq的源代码。
函数的输入方式有两种:
J = ADAPTHISTEQ(I)
J = ADAPTHISTEQ(I,PARAM1,VAL1,PARAM2,VAL2...)
显然第一种使用的是默认参数。
参数有:
-
NumTiles:是一个[M N]行向量,表征tile的行和列数。默认8x8。最好通过实验确定。
-
ClipLimit:0到1的一个标量,表征最大最大clip。显然是归一化的。默认0.01。如果太大,CLAHE退化为AHE。
-
NBins:输出图像直方图的柱子个数。因此输入图像和输出图像的位数不一定相同,NBins越大,动态范围越大,但速度越慢。默认为256。
-
Range:要么是'original',要么是'full'。前者限制变换范围在[min(I(:)) max(I(:))],后者是整个允许范围。默认为full。
-
Distribution:每一个tile的直方图的目标。'uniform', 'rayleigh', 'exponential'。默认为均衡分布'uniform'。对于水下图片,瑞利分布更自然。
-
Alpha:非负标量,在瑞利分布和指数分布时使用。
为了简化计算,以及避免边界效应,这里只计算了每一个tile的cluster,其余像素点使用了插值的方法:
% 4. Interpolate gray level mappings in order to assemble final CLAHE image
% * extract cluster of four neighboring mapping functions
% * process image region partly overlapping each of the mapping tiles
% * extract a single pixel, apply four mappings to that pixel, and
% interpolate between the results to obtain the output pixel; repeat
% over the entire image
原文说明:
图2.细节和差值应用到自适应直方图均衡中,得到的AHE。
- (a)白点表示的像素值由周围的相关区域的灰度值获得。点A,B,C,D是相关的区域的中心,具体的区域灰度mapping(gA(s),gB(s),gC(s),gD(s))是基于像素的直方图获得。假设相同位置点的原始像素值是s,新的灰度值通过mapping每一个环绕的区域进行双线性差值得到以下,其中x和y是相对于点A的距离。在边和角中,一个很小的不同插值技术被使用。
- (b)图1a在图像中应用8*8的相关区域进行AHE得到的结果。虽然膝盖的结构能够更好的辨别,但整个图像都处在一个噪声的环境中。
CLAHE变换的主要优势是它只使用一个参数—裁剪限制,它的图像处理结果更优。
CLAHE也有缺点,由于这种方法目标是使对比度最优,原始图像与CLAHE处理结果不是1对1的关系,然而,CLAHE图像不是规范化的计算,它主要是依靠图像的像素值进行计算。