对比度与对比度增强算法:对比度拉伸、直方图均衡与CLAHE
TL;DR :对比度表示图像的明暗对比强度,体现图像的细节对比关系和视觉观感效果;对比度拉伸和直方图均衡都是通过LUT表重映射原图像素取值来获得更好的对比度的图像,其中直方图均衡相当于根据原图直方图分布自适应的对比度拉伸。而CLAHE(限制对比度的自适应直方图均衡)是一种用自适应曲线映射的方式调整图像对比度的方法,它的核心在于即根据待调整区域的直方图设置目标曲线,同时又对曲线的形状进行一定程度的限制,使其更加保守,防止映射函数过于陡峭导致颜色分层等一系列问题。
图像的对比度
一幅图像的对比度主要指的是图像中的明暗关系的对比强度,对比度高意味着图像视觉观感更加生动、通透,画面中的各种内容都可以比较好地被我们获取到;相反,对比度低则通常意味着画面灰蒙,图像中的各个物体取值差不多,不能很好地体现出不同内容之间的明暗关系变化,从而显得画面过平,不够立体和通透;
从数学角度上来说,对比度可以通过图像中最大值和最小值的之间的差异来进行度量。对于常见的uint8类型的(取值范围为0-255之间的整数)图像来说,其对比度可以通过最大值和最小值之间的差值来衡量,差值越大意味着对比度越高。当然,这种方式并不能完全反映图像的对比度情况,设想一张图像,其绝大部分取值分布在90-100之间,但是在0和255处各自有一个像素取值到,那么实际上这张图的的对比度也是很低的(范围只有10个值的区间!)。这个例子可以看出,对于对比度的考察,最好的方法是可以通过直方图来进行,因为直方图不但反映了取值,而且表现出了取值的像素数量的比例。
从直方图角度来说,对比度高意味着直方图在整个取值范围上展布的较为均匀,由于图像的显示范围(比如0-255)是离散且有限的,两个数值如果差异较小就会被离散化到同一个bin中,从而无法区分而导致图像损失细节。因此,直方图展布越均匀的图像越能够充分利用图像的显示范围,从而更充足地显示图像中的细节。
下面展示了几个不同对比度的图像,及其对应的直方图关系,可以直观地对两者建立联系。
对比度拉伸与直方图均衡
由于实际场景中,并不是所有图像都具有较优的对比度,因此如何提升图像的对比度从而优化观感是一个重要的需求。
从前面提到的对比度与直方图的关系可以很自然地想到,既然低对比度是由于直方图过于集中,那么如果我们可以通过某种方式,将低对比度图像的直方图“拉拽”到图像显示范围两端,那么它的对比度就会被提升。直方图的拉伸(stretching)对应于图像的操作就是对各个像素施加一个重映射,即设置一个LUT表(Look-Up Table),将原始图像中的每个像素的值映射到另一个值,这个LUT表示全局的,也就意味着所有的点都采用同样的映射方式。这种LUT映射可以参考OpenCV中的cv::LUT函数,在OpenCV中可以直接调用这个函数,将原图通过定义好的LUT映射到目标图。
那么,对比度拉伸的LUT曲线应该具有怎样的性质呢?考虑到应当尽可能将原始图像集中在某段位置[a,b]的直方图拉到两端,那么a应该对应到0,b应该对应到255(以uint8为例)。因此,曲线应当是一个斜率大于1的斜线,并且两端被y=0和y=255所截断。考虑到前面提到过的情况,低对比度分布的集中不一定是其他区域完全为0,因此这个截断的直线应为S形曲线,其对应的物理含义就是将窄带分布进行展宽。
上述操作就是对比度拉伸的基本操作,在PS、美图秀秀等图像编辑软件中,我们通常可以通过“曲线”功能来设置对比度拉伸的LUT曲线。但是这种方法是需要预先设定LUT表的,而不同的图像所需的最合适的LUT表示不同的,因此需要一种自适应方案,让我们可以自动获取到最合适的LUT表。这就是直方图均衡策略(histogram equalization)。
直方图均衡的基本目标是通过LUT重映射,使得每张图片处理后都可以理论上实现直方图分布为均匀分布。通过数学推导【TODO】可以发现,当映射曲线为每张图片的CDF(cumulative distribution function,即直方图的积分)时,可以将直方图映射到均匀分布。该操作就是直方图均衡。
CLAHE的算法原理与参数
尽管直方图均衡可以满足自适应调整对比度的目的,但是由于它的映射LUT曲线直接来自原图,这种设定在原图直方图分布比较极端的时候容易出现不鲁棒的情况,具体表现在映射LUT表在局部具有过大或者过小的斜率,即过于陡峭/平缓。斜率过大,也就意味着原图中取值接近的两个值会被映射到差距更大,表现在图像上就是断层现象;相反,斜率过小则多个值映射到同一个值,表现在图像效果上就是涂抹感(细节内容损失)。为了对这种极端情况进行一定的修正,于是产生了CLAHE算法。
CLAHE算法相对比与上述的直方图均衡,主要有两点改进:
- 由全局统计直方图改为局部统计并进行映射,这个改动带来的提升是自然的;
- 在原图直方图->CDF(作为LUT)的计算过程中,对大于某个设定阈值的直方图取值进行限制,并将多出的面积均分到所有取值中,从而使得原图直方图较为平缓,得到的LUT表也尽量减少斜率过大的情况。
CLAHE的基本计算逻辑示意图如下所示(上方为处理前后的直方图,下方为与上面对应的CDF曲线,可以看到CLAHE处理后的曲线更加平滑无大斜率突变)。