Single Image Haze Removal Using Dark Channel Prior 论文阅读

2009年CVPR 这篇经典之作,现在普遍处理去雨去雾都会使用深度学习,cnn之类的算法。何凯明大佬这篇论文是完全从物理角度传统方法进行处理。

在计算机视觉和计算机图形中,下述方程所描述的雾图形成模型被广泛使用

                         

其中I(X)就是input(待去雾的图像),J(x)是clean image,即要输出的图像,A是全球大气光成分, t(x)为透射率。现在的已知条件就是I(X),要求目标值J(x),显然,这是个有无数解的方程。

作者提出了Dark Channel Prior这一理论。Dark Channel Prior:

在大多数的非天空的去雨中,有一些像素总有至少一个RGB通道极其低的值。即它的光强很小,接近于0。

根据文中所提到的,在现实生活中造成这种现象主要有三个因素:

  1. 汽车、建筑物和城市中玻璃窗户的阴影,或者是树叶、树与岩石等自然景观的投影;
  2. 色彩鲜艳的物体或表面,在RGB的三个通道中有些通道的值很低(比如绿色的草地/树/植物,红色或黄色的花朵/叶子,或者蓝色的水面)
  3. 颜色较暗的物体或者表面,例如灰暗色的树干和石头。总之,自然景物中到处都是阴影或者彩色,这些景物的图像的暗原色总是很灰暗的。

根据论文中的定义,对于任意的输入图像J,暗通道可用下式进行表达

                            

式5解释起来也很简单,将每个像素中RGB分量的最小值存入和原始图像相同的灰度图中,下图为论文中的实例,我们可以发现,雾越浓的位置其像素值越接近0.。

                                                             

大气散射模型

为了方便计算,假设一定区域内其传输值为一定值,设其为最小值。

                 

将上式稍作处理,变形为下式

             

假设在每一个窗口内透射率t(x)为常数,也就是假设在同一窗口的上的透射率是相同的,定义他为,且A值已经给定,然后对式(7)两边求两次最小值运算得到下式:

            

J是待求的无雾的图像,根据前述的暗原色先验理论有:

        

            

代入整理可得

这个模型受限于对于天空并不是最优,不过天空总是与大气光A十分相似,因此在天空区域,我们可以假定

            

即当RGB超过一定值时,我们可以近似将其一律处理为自然光。

论文中使用的是soft matting进行软处理,而在大神发表的论文guideFilter,这里便用引导滤波进行处理,调整半径,引导图与原图尽量相似。导向滤波的r值应当不小于进行最小值滤波半径r的4倍。

将图片优化。

即使是晴天白云,空气中也存在着一些颗粒,因此,看远处的物体还是能感觉到雾的影响,另外,雾的存在让人类感到景深的存在,因此,有必要在去雾的时候保留一定程度的雾,这可以通过在式(11)中引入一个在[0,1] 之间的因子,则式(11)修正为:

             

注:文中所有的测试结果依赖于:  ω=0.95

接下来,求出A自然光。

 上述推论中都是假设全球达气光A值时已知的,在实际中,我们可以借助于暗通道图来从有雾图像中获取该值。具体步骤如下:

      1) 从暗通道图中按照亮度的大小取前0.1%的像素。

          2) 在这些位置中,在原始有雾图像I中寻找对应的具有最高亮度的点的值,作为A值。

     到这一步,我们就可以进行无雾图像的恢复了。由式(1)可知:  J = ( I - A)/t + A  

     现在I,A,t都已经求得了,因此,完全可以进行J的计算。

     当投射图t 的值很小时,会导致J的值偏大,从而使得图片像素为0,因此一般可设置一阈值T0,当t值小于T0时,令t=T0,本文中所有效果图均以T0=0.1为标准计算。

              

最后,该方法也存在一定的局限性-烟雾成像模型可能是无效的,例如对天空地区的影响,以及地平线附近的蓝色色调。

以下是我根据论文的过程进行去雾的实现。

 以上的图片感觉处理的都不错。

真的是效果不太好,为了改善,我加上了这段代码,虽然能好一些,但还是效果不能令人满意。

if A > 240/255.0:
    A = 240/255.0  

最后效果如下图 

猜你喜欢

转载自blog.csdn.net/ltd0924/article/details/86544920