一、算法背景

  暗通道先验去雾算法是大神何恺明2009年发表在CVPR上的一篇论文,还获得了当年的CVPR最佳论文。

  根据论文的介绍,暗通道去雾算法是基于一个关键的观察:在没有雾霾的室外图像中,大多数局部区域包含一些像素,这些像素在至少一个颜色通道中具有非常低的强度(原文:It is based on a key observation - most local patches in haze-free outdoor images contain some pixels which have very low intensities in at least one color channel)。因此,基于这个先验知识,可以直接评估出雾霾的厚度,并恢复出高质量的图像,同时还能得到高质量的深度图。

  在计算机视觉领域,对于雾霾图像的模型定义为:
在这里插入图片描述

  这个模型可以这样理解,I表示带有雾霾的图像,J表示没有雾霾的图像,t表示透射率,描述了光通过介质投射到摄像头过程中没有被散射的部分,A表示全局大气光照。公式的第一项叫做直接衰减项(direct attenuation),用来描述图像场景中,光在介质中经过衰减的部分;第二项表示大气光照(airlight),它由图像采集装置前方的散射引起,会导致景物色调的偏移。当大气是均匀的时候,透射率t可以表示为如下公式:
在这里插入图片描述
其中β是大气的散射系数。这个公式表明,随着景深的增加,场景的亮度呈指数衰减。


  所以,从图像处理的角度讲,雾霾图像模型表示,在RGB颜色空间中,向量A、I、J是共面且终点是共线的,如下图所示:
在这里插入图片描述
所以,透射率t就可以表示为:
在这里插入图片描述
其中,c ∈ {r, g, b},表示图像颜色通道的下标。

  算法提出的背景模型如此,暗通道去雾算法则是在这个模型上,提出了一个新的先验知识-暗通道先验,从户外雾霾图像中直接估算透射率t。在知乎上看到一张图有点意思哈,应该可以帮助理解,作者见水印:
在这里插入图片描述

二、算法原理

2.1 算法提出

  暗通道先验法是基于一个观察结果:在大多数非天空的区域中,至少有一个颜色通道在某些像素处具有非常低的强度。换句话说,这样一个区域中的最小强度值应该非常低,所以对于一幅图像J,定义了其暗通道去雾算法的模型:
在这里插入图片描述
其中,Jc表示无雾图像J三个颜色通道的暗原色,Ω(x)表示以x为中心的局部区域块,作者的观察发现,除了天空区域,Jdark的强度是非常低、趋于0的,Jdark叫做无雾图像J的暗通道,上面的这个观察叫做暗通道先验法。

  论文提到,暗通道的低强度的原因主要有三个:a)、阴影,如城市景观图像中的汽车、建筑物和窗户内部的阴影,或景观图像中的树叶、树木和岩石的阴影等;b)、有颜色的物体或者其表面,任何颜色通道中缺少颜色的对象(例如,绿草/树/植物、红色或黄色的花/叶、蓝色的水面)都会导致暗通道中的值较低;c)、深色物体或表面,深色树干和石头等。由于自然的室外图像通常充满阴影和色彩,这些图像的暗通道真的很暗!

  作者收集了很多图像并计算了他们的暗通道图像,如下:
在这里插入图片描述
在这里插入图片描述
可以看到,暗通道中大约75%的像素值为零,90%的像素强度低于25,大多数暗通道的平均亮度都很低,这意味着只有一小部分室外无霾图像偏离了暗通道先验理论。

2.2 透射率估算

  论文给出的透射率t的计算公式如下:
在这里插入图片描述
其中,ω的值是基于应用的,论文中所有实验的值取0.95。这部分的推导如下:

  首先假设大气光A是给定的、局部区域Ω(x)也是恒定的,对雾霾图像模型取最小值操作(注意这里是对三个通道独立操作):
在这里插入图片描述
等价于
在这里插入图片描述
对上式三个通道图像取最小值操作,得到:
在这里插入图片描述
根据暗通道先验理论,Jdark是趋于0的:
在这里插入图片描述
Ac是一个正数,所以可以表示为:
在这里插入图片描述
最后,推导得到:
在这里插入图片描述
事实上,在这里插入图片描述 是归一化的雾霾图像的暗通道,它直接给出了透射率的估值。暗通道先验法对于天空区域而言不是好的先验模型,但天空的颜色通常与雾霾图像中的大气光A非常相似,所以在天空区域有:
在这里插入图片描述
由于天空是无限的并且趋向于零传输,所以不需要事先分离天空区域,可将其与非天空区域的处理等同。同时,论文还引入常数ω(0<ω≤1),为了让处理结果看起来更自然一些,理由是现实生活中,即使是晴天白云,空气中也会存在一些颗粒,看远方的物体还是能够感觉到雾的影响,另外,雾的存在可以让人们感觉到景深的存在,所以需要保留一部分的雾:
在这里插入图片描述

2.3 软抠图(Soft Matting)

  作者注意到雾模型公式与图像抠图(抠图…怪怪的翻译)方程形式比较类似,所以才采用了软抠图算法来优化透射率。首先用t(x)来表示精确的透射率,那么估算的透射率与之差值为:
在这里插入图片描述
其中,L表示抠图拉普拉斯矩阵(the Matting Laplacian matrix),而λ是一个正则化参数,上式的第一项是一个平滑项,第二项是一个数据项,L矩阵的第(i,j)项定义为:
在这里插入图片描述
其中,IiIj是输入图像在ij处像素的颜色;δij表示Kronecker delta,μkΣk表示区域wk内的颜色的均值矩阵和协方差矩阵;U3是一个3×3的单位矩阵;ε是一个正则化参数;|wk|表示区域wk内的像素的个数。

  通过求解下列稀疏线性系统,可以得到最优t
在这里插入图片描述
其中,U是和L一样大小的单位矩阵,这里λ取一个很小的值(10-4)。

  我们使用soft matting来细化已经填充了整个图像的粗糙的t,下图c就是soft matting的结果,b是数据项。
在这里插入图片描述

2.4 恢复场景亮度

  得到透射率图后,可以根据雾霾模型公式恢复出场景的亮度,但是,当t(x)接近0的时候,直接衰减项J(x)t(x)也是接近0,直接恢复J会容易受噪声干扰,因此需要对t做一个下界t0的限制(论文取0.1),这意味着,在非常密集的雾霾区域,会保留少量的雾霾。最终,J(x)表示为:
在这里插入图片描述

  由于场景的亮度通常不如大气中的光线明亮,所以去除雾霾后的图像看起来很暗淡,因此一般是对图像做一个曝光调整。

2.5 估算大气光

  雾霾图像的暗通道很好地近似于雾霾的密集度(见下图(b))。可以利用暗通道来改进大气光估计。首先选择暗通道中最亮的0.1%的像素。这些像素是最不透明的(在下图(b)中以黄线为界)。在这些像素中,选择输入图像I中强度最高的像素作为大气光。这些像素位于下图(a)中的红色矩形中,但这些像素可能不是整个图像中最亮的。这种基于暗通道先验的简单方法比“最亮像素”方法具有更强的鲁棒性。
在这里插入图片描述

2.6 实验结果

在这里插入图片描述
在这里插入图片描述

在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
  这些实验结果都是论文里的图像,实际上,后面的研究也提出了soft matting的结果还是有点粗糙的,而且速度也是不够快,所以2011年,作者又提出导向滤波来获得更细腻的结果,导向滤波的运算主要集中在方框滤波(均值滤波),因此可以考虑通过积分图等的方法来优化,而且另一个重要的应用前提是opencv集成了挺多快速算法的,用起来也方便。

三、参考

[1] Single Image Haze Removal Using Dark Channel Prior

知君书记本翩翩,
为许从戎赴朔边。
红粉楼中应计日,
燕支山下莫经年。
– 唐 杜审言 《赠苏绾书记》

Logo

开放原子开发者工作坊旨在鼓励更多人参与开源活动,与志同道合的开发者们相互交流开发经验、分享开发心得、获取前沿技术趋势。工作坊有多种形式的开发者活动,如meetup、训练营等,主打技术交流,干货满满,真诚地邀请各位开发者共同参与!

更多推荐