本文的分析基于《Adaptive and integrated neighborhood-dependent approach for nonlinear enhancement of color images》一文相关内容,但对其进行了深度的改良。

  我们首先解读或者说翻译下这篇论文。

  论文公布的时间是2005年了,已经是比较久远的了,我第一次看到该论文大概是在2014年,后面在2016年左右实现了该算法,这里还有当时开发留下的记录,居然是除夕左右做的。佩服自己。

   以前没有特别注意到该算法的效果,觉得也就那样吧,所以没有怎么去发挥它,但是,最近再次审视,发现他除了实现实现简单、速度快,而且还具有效果佳、适应性广、不破坏本身就光照好的位置等等众多优点,似乎比目前我看到的低照度增强算法都好。

  算法本身的步骤分为三步,第一步是根据的图像亮度分布建立一个自适应的全局映射函数,这一步大大的提高了图像中暗部像素的像素值,同时也压缩了图像的动态范围。第二步是所谓的自适应对比度增强,根据像素领域内的平均值和像素值本身的比例,做一个映射,提高整体的对比度。后续还有一个步骤是颜色恢复的过程。

  第一步的全局曲线调整如下所示:

  首先计算出彩色图像的亮度值,这个其实可以有很多方式,包括常用的YUV空间的Y通道,HSL空间的L分量,甚至可以使用我提到的对比度保留去色那种方式获取,论文里使用的是最普通的计算公式:

        

  我们把亮度归一化得到:

       

  然后我们用下面这个传输函数(映射函数)来将亮度图像进行一个线性的增强:

                          

   其中的参数Z值由图像本身的内容决定,如下所示:

            

  式中的L表示亮度图像的累计直方图(CDF)达到0.1时的色阶值,也就是说如果亮度图像中90%的像素值都大于150,则Z=1,如果10%或者更多的像素值都小于50,则Z取值为0,否则其他情况Z则根据L的值线性插值。

  稍作分析下,如果Z=0,说明图像中存在大量的偏暗像素,图像有必要变亮一些,如果Z=1,则说明图像已经很亮了,则此时图像无需继续加亮处理。介于两者之间时,我们也就做中和处理。

  那么我们采用的传输函数是否能达到这种需求呢,我们来看下公式(3)的组成和曲线。

       

   以Z=0为例,如上图2所示,曲线6为公式(3)最后对应的结果。我们看看其组成。公式(3)的第一和第二部分对应图2中的曲线2和3,他们的和得到曲线4。曲线2中在低亮度区域的增强很显著,在高亮度区域逐渐变缓,曲线3是一个线性函数,随亮度增加线性的减少。公式(3)的第三部分对应曲线5,曲线4和曲线5累加后得到曲线6。可见最终的曲线在低亮度区域显著增强亮度,在高亮度区域缓慢增加亮度。当然这里也是可以采用其他具有类似作用的曲线的。

  对于不同的Z值,图像给出了最终的相应曲线,可见,随着Z值的增加,曲线逐渐变为一条直线(不变化),而我们前面的自适应Z值计算的过程也随着图像亮度的增加而增加,也就是说如果图形原本就很亮,则Z值就越大,基本上图像就没什么调整了,这基本上就是自适应了。

  第二步:自适应对比度增强。

  经过第一步处理后,图像的亮度自适应的得到了增强,但是图像的对比度明显减少了。普通的全局对比度增强算法的过程是使亮的像素更亮,暗的像素更暗(似乎和第一步有点相反的感觉),这样图像的动态方范围就更广了,同时由于这种方法在处理不考虑领域的信息,对于那些领域和他只有细微的差异的像素,其细节很难得到有效提升。因此,我们需要考虑局部的对比度增强,这种增强下,不同位置相同像素值得像素在增强后可以得到不同的结果,因为他们一般会有不同的领域像素值。当当前像素值比周边像素的平均值大时,我们增大当前像素值,而当前像素值比周边像素平均值小时,我们减少它的值。这样的处理过程结果值和当前像素值的绝对值没有关系,至于领域信息有关了。这样,图像的的对比度和细节都能得到有效的提升,同时图像的动态范围也有得到有效的压缩。

  通常,一个比较好的领域计算方式是高斯模糊,我们采用的计算公式如下所示:

                        

  式中,S(x,y)为对比度增强的结果。指数E(x,y)如下所示:

                 

  下标Conv表示卷积,注意这里是对原始的亮度数据进行卷积。P是一个和图像有关的参数,如果原始图像的对比度比较差,P应该是一个较大的值,来提高图像的整体对比度,我们通过求原始亮度图的全局均方差来决定P值的大小。

                        

  当全局均方差小于3时(说明图像大部分地方基本是同一个颜色了,对比度很差),此时P值取大值,当均方差大于10时,说明原图的对比度还是可以的,减少增强的程度,均方差介于3和10之间则适当线性增强。

   这个对比度增强的过程分析如下,

   当卷积值小于原始值时,也就是说中心点的亮度大于周边的亮度,此时E(x,y)必然小于1,由于I’(x,y)在前面已经归一化,他是小于或等于1的,此时式(7)

 的值必然大于原始亮度值,也就是亮的更亮(这里的亮不是说全局的亮,而是局部的亮)。如果卷积值大于原始值,说明中心点的亮度比周边的暗,此时E(x,y)大于1,导致处式(7)处理后的结果值更暗。

  为了得到更好的对比度增强效果,我们一般都使用多尺度的卷积和增强,因为各个不同的尺度能带来不同的全局信息。一般来说,尺度较小时,能提高局部的对比度,但是可能整体看起来不是很协调,尺度较大时,能获得整体图像的更多信息,但是细节增强的力度稍差。中等程度的尺度在细节和协调方面做了协调。所以,一般类似于MSRCR,我们用不同尺度的数据来混合得到更为合理的结果。

             

  尺度的大小,我们可以设置为固定值,比如5,20,120等,也可以根据图像的大小进行一个自适应的调整。

  第三步:颜色恢复。

  此步比较简单,一般就是使用下式:

   

   Lamda通常取值就为1,这样可以保证图像整体没有色彩偏移。

  以上就是论文的主要步骤,按照这个步骤去写代码也不是一件非常困难的事情: