Single Image Haze Removal Using Dark Channel Prior

描述

这篇文章不用多说了。看作者:何恺明,孙剑,汤晓鸥。事实上这篇文章是2009年CVPR的Best Paper,我在上学时就已经读过这篇文章了。那时刚入门还不太懂这三人有多厉害,只觉得这篇文章真的很炫酷。

这几年,有幸上过孙老师的一堂课,家里人也曾在旷视工作过。这几天有相关的契机,就重新分析一下这篇文章,膜拜一下何博士,缅怀一下孙老师。

关于去雾,我会写两篇文章。出于兴趣,第二篇我亲手撸了一下该论文的代码,分析一下实验结果。这一篇主要对论文内容进行评述。蓝色部分是我认为论文中关键的语句,标出来重点关注。红字部分属于我的话,有助于快速理解论文。

Abstract

在本文中,我们提出了一种简单但有效的图像先验-暗通道先验,用它可以从单个输入图像中去除雾。暗通道先验从无雾室外图像进行的统计所得。这是基于一个关键的观察:没有雾的室外图像中,大多数局部块包含一些像素,它们至少有一个颜色通道值非常低。使用此先验和雾成像模型,我们可以直接估计雾的厚度,并恢复成高质量的无雾的图像。对各种室外雾霾图像的结果证明了,我们提出的这个先验的威力。此外,去雾的同时还可以获得高质量深度图。

1. Introduction

室外场景的图像通常会因大气中的混浊介质(例如颗粒、水滴)而退化。雾、雾和烟雾是由于大气吸收和散射而产生的现象。摄像机从场景点接收的辐射沿视线衰减。此外,入射光会与空气光混合[6](大气颗粒反射到视线中的环境光)。退化图像会失去对比度和色彩,如图1(a)所示。由于散射量取决于场景点与摄像机的距离,因此退化的程度是随空间而变化的。有雾图像不好

消费者/计算摄影学和计算机视觉应用中都特别想要去雾。首先,去除雾霾可以显著提高场景的可见性,并纠正空气光引起的颜色偏移。通常,无雾的图像在视觉上更令人愉悦。其次,从低层次的图像分析到高层次的目标识别,大多数计算机视觉算法通常假设输入图像(在辐射标定后)是场景辐射亮度。视觉算法(如特征检测、滤波和光度分析)的性能在有偏、低对比度场景辐射的图像上降低。最后,去雾后可以产生深度信息,并有助于许多视觉算法和高级图像编辑。雾可以包含深度信息线索,会有助于场景理解的。不好的有雾图也可以有大用处。去雾对很多研究都有用,大家都想去雾

然而,去雾是一个具有挑战性的问题,因为雾依赖于未知的深度信息。如果输入仅为单个有雾图像,则该问题是欠约束的。因此,已经有许多方法通过使用多个图像或附加信息来解决。基于偏振的方法[14,15]通过以不同偏振度拍摄的两个或多个图像来消除雾效应。在[8、10、12]中,从不同天气条件下同一场景的多幅图像中获得了更多约束。基于深度的方法[5,11]需要来自用户输入或已知3D模型的粗略深度信息。 有些人利用多张图像输入来去雾

最近,单图像去雾[2,16]取得了重大进展。这些方法的成功在于使用更强的先验或假设。Tan[16]观察到,无雾图像与有雾图像相比,必须具有更高的对比度,他通过最大化恢复图像的局部对比度来消除雾,结果的视觉效果不错,但在物理上可能无效。Fattal[2]估计场景的反照率,然后在假设透射和表面阴影局部不相关的情况下推断介质透射。Fattal的方法是合理的,可以产生不错的结果。然而,这种方法不能很好地处理重雾图像,并且在假设被打破的情况下可能失败。 单图像去雾也有人研究,但方法都有些问题

在本文中,我们提出了一种新颖的先验——暗通道先验,用于单图像去雾。暗通道先验基于无雾的室外图像的统计。我们发现,在大多数局部区域(不包括天空)中,某些像素(称为“暗像素”)在至少一个颜色(rgb)通道中的强度值非常低。在雾霾图像中,该通道中这些暗像素的强度主要由大气光贡献。因此,这些暗像素可以直接提供雾度透射的精确估计。结合雾度成像模型和soft matting方法,我们可以恢复高质量的无雾图像,并生成良好的深度图。

我们的方法在物理上是有效的,即使在浓雾图像中也能处理远处的物体。我们不依赖输入图像中透射或表面着色的显著差异。我们的结果会包含少量光晕伪影。

与任何使用强假设的方法一样,我们的方法也有其自身的局限性。当场景对象本质上在大局部区域上与空气光类似并且没有阴影投射在对象上时,暗通道先验可能无效。虽然我们的方法适用于大多数有雾的室外图像,但在某些极端情况下可能会失败。我们相信,从不同的方向开发新的先验知识非常重要,将它们结合在一起将进一步提高技术水平。 作者提出了基于单幅图像的暗通道先验方法,去雾效果很好,也十分合理。

2. Background

此章节介绍了雾模型,有助于理解本文提出的暗通道先验

在计算机视觉和计算机图形学中,广泛用于描述有雾图像形成的模型如下 :

重要:贯穿全文的核心公式

其中I是观察到的强度(有雾图像的强度),J是场景辐射亮度(真实的强度),A是全局的大气光,t是介质投射率,描述的是没有被散射并到达了相机的部分光。 去雾的目标,就是从已知的I中恢复JAt

等式的第一项J(x)t(x)称为直接衰减,第二项A(1− t(x))称为大气光(airlight)。直接衰减描述的是场景辐射亮度及其在介质中的衰减,而空气光是由先前散射的光产生的,并导致场景颜色的变化。当大气均匀时,透射t可以表示为:

其中β是大气的散射系数。这表明场景辐射亮度随场景深度d呈指数衰减。 以公式的形式给出:有雾图像是由两部分构成的,一部分是真实亮度被大气衰减后剩余值(得到的真实部分是没有被散射的),另一部分是大气光散射的光(得到的大气部分是被散射在空中的)。另外,距离越远,原本场景的辐射亮度会衰减的越多

几何上,成像方程(1)意味着在RGB颜色空间中,向量AI(x)J(x)是共面的,它们的端点是共线的(见图2(A))。传输t是两个线段的比率:

式子中c ∈ {r, g, b} 是RGB颜色的通道id

参考文献[16]做了如下定义,对于具有均匀透射率t的patch,输入图像的可见性(梯度之和)因雾度而降低,因为t<1:


均匀透射率t的patch,意味着第二项A(1-t)是一个常值。那么有雾图像的梯度是会小于真实图像的梯度的,公式中倒三角是梯度。

辰:公式3是由公式1推导出的,另外根据图2比较好理解公式3。文章接下来有三段来继续描述参考文献[2]和[16]的方法,也就是单幅输入图像去雾的研究。我没看过这两篇文章,所以理解不深刻,就暂不做出解释了。

这一节主要还是对去雾这个问题做了一个定义。从算法实现的角度,我把三个最重要的点列一下:1. 定义了雾的模型,公式1将是算法实现的核心。2. 去雾,就是要估计出大气光,进而估算出透射率,最后复原出没有雾的图像。3. 透射率一定是小于1的

3. Dark Channel Prior

暗通道先验是基于对无雾室外图像的观察:在大多数非天空的patch中,至少有一个颜色通道在某些像素处具有非常低的强度。换句话说,这个patch中的最小强度应该是一个非常低的值。对于一张图像J,我们定义:

其中j^c是J的颜色通道,Ω(x)是以x为中心的局部patch。我们的观察表明,除了天空区域外,如果J是无雾的室外图像,那么J^{dark}的强度较低且趋于零。我们称J^{dark}J的暗通道,我们将上述统计观察或知识称为暗通道先验。 什么是暗通道

暗通道中的低强度主要由三个因素造成:a)阴影。例如城市景观图像中汽车、建筑物和窗户内部的阴影,或景观图像中树叶、树木和岩石的阴影;b) 彩色物体或表面。例如任何颜色通道中缺少颜色的物体(例如,绿草/树木/植物、红色或黄色的花/叶和蓝色的水面)将导致暗通道中的低值;c) 暗物体或表面。例如黑色的树干和石头。由于自然室外图像通常充满阴影和色彩,这些图像的暗通道真的很暗!暗通道低的图片都是什么

为了验证暗通道的性能,我们从flickr.com(由FLICKR用户注释的150个最流行的label)和几个图像搜索引擎中收集了一组室外图像。由于雾霾通常发生在室外景观和城市景观中,我们从下载的图像中手动选择无雾霾的景观和城市风景。其中,我们随机选择5000幅图像,并手动切出天空区域。调整其大小,使其最大宽度和高度为500像素,并使用15×15的补丁大小计算其暗通道。图3显示了几个室外图像和相应的暗通道。

图4(a)是所有5000个暗通道的强度直方图(横坐标为像素值,纵坐标为该像素值图像个数占总个数的百分比),图4(b)是相应的累积直方图(这样看比例更清楚)。我们可以看到,暗通道中约75%的像素具有零值,90%的像素的强度低于25。这一统计数据为我们的暗通道先验提供了非常有力的支持。我们还计算每个暗通道的平均强度,并在图4(c)中绘制相应的直方图。同样,大多数暗通道的平均强度非常低,这意味着只有一小部分无雾室外图像偏离了我们之前的图像。用事实来证明,无雾的图像确实有暗通道先验这一特性,暗通道的提出是合理的。下文的暗通道指的就是每个原始图像的暗通道图像

由于附加空气光,在透射t较低的情况下,雾图像比其无雾版本更亮。因此,霾图像的暗通道在具有更密集霾的区域中将具有更高的强度。从视觉上看,暗通道的强度是雾度厚度的粗略近似值(见图3右侧)。在下一节中,我们将使用此属性来估计透射和大气光。观察图3有雾图片的暗通道,挺有意思的,你会发现它真的和雾很近似

注意,我们忽略了天空区域,因为无雾图像的暗通道在这里可能具有高强度。幸运的是,我们可以通过使用霾成像方程(1)和先验知识来优雅地处理天空区域。没有必要明确地切出天空区域。我们将在第4.1节中讨论这个问题。暗通道这个特性对天空是不适用的。这一点很重要,我们在后期的代码实现中会有所体现。

我们的暗通道先验部分受到广泛应用于多光谱遥感系统的众所周知的暗物体减法技术的启发。在文献[1]中,作者通过减去与场景中最暗的对象相对应的恒定值来去除空间均匀的雾。在这里,我们推广了这一思想,并提出了一种新的自然图像去模糊先验。参考文献1使用了减去最暗像素值的方法来去雾,对我们有一定的启发

Haze Removal Using Dark Channel Prior使用暗通道先验的去雾

4.1. Estimating the Transmission估计透射

这一节就是在假设大气光已知的情况下,给出透射图x(t)的表示

首先假设大气光A是固定的,假设局部patch的透射是固定的。对之前的雾模型公式(1)两边做一个取最小的运算,得到:

最小操作是在三个颜色通道上独立执行的。该方程等价于:

接下来,对三个通道得到的三个最小值,再取最小值,方程如下:

根据暗通道先验,无雾图像的暗通道J^{dark}值趋于零:


又由于A^c总是正的,所以我们也可以这样写:

我们把等式10带到等式8中,就可以得到这样的关系:

根据之前的统计结果,我们神奇的将公式中的一项置成了0,就得出了透射图的表达公式。

事实上,min_c (min_{y ∈ Ω(x)}(\frac{I^c(y)}{A^c})) 就是图像 \frac{I^c(y)}{A^c}的暗通道。

我们前面提到过,暗通道先验对于天空区域不是一个好的先验。幸运的是,天空的颜色通常与烟雾图像中的大气光A非常相似,因此天空部分的patch会满足这样的关系:

在天空区域。由于天空是无限的,并且趋于零透射值,等式(11)优雅地解决了天空区域和非天空区域的划分,这样我们就不需要对图像预先分离天空区域。

又是一个很巧妙的表达,透射值接近0的就是天空

实际上,即使在晴天,大气中也并非完全没有任何粒子。因此,当我们观察远处的物体时,烟雾仍然存在。此外,烟雾的存在是人类感知深度的基本线索[3,13]。这种现象称为空中透视。如果我们彻底去除烟雾,图像可能看起来不自然,深度感可能会丢失。因此,我们可以选择性的在公式中引入恒定的参数ω(0<ω≤1),来保持远处物体具有非常小的雾度。

这种修改的好处在于,我们自适应地为远处的物体保留更多的雾。ω的值基于应用。本文采用的值为0.95。物理世界有雾是很正常的,作者加了一个0.95的参数。这个参数在天空部分会起到作用,保证了算出的透射值不为0。

图5(b)是根据输入有雾图像(图5(a))估计的透射图,使用的patch大小为15×15。它相当不错,但包含一些光斑效应,是因为同一patch中的透射值一致,这个设定并不总是正确的。在下一小节中,我们使用Soft matting方法重新定义该地图。

Soft matting是作者的另一个贡献,有助于提升去雾效果。下一篇文章的代码实现,我们会看出soft matting对去雾结果的提升,有效解决了边缘出现的光斑

4.2. Soft Matting

利用Soft Matting,优化原有的透射图。参考文献为2006年CVPR《A closed form solution to natural image matting.》后期何恺明在2010年ECCV上《Guided image filtering》提出了导向滤波的方法,可以用于替换Soft Matting,我后期再分析。

我们注意到雾模型成像公式(1),具有与Image Matting类似的形式。透射图正是alpha图。因此,我们采用应用Soft matting来重新定义透射。
这里我引申一下Image Matting的知识,你会发现确实与雾模型相近,不过恕我直言,其实就是类似于求两向量之间向量的一个基本公式:
对于一张图I, 我们感兴趣的人像部分称为前景F,其余部分为背景B,则图像I可以视为FB的加权融合:I = \alpha * F + (1 - \alpha) B,而Image Matting(抠图)任务就是找到合适的权重\alpha
用t(x)表示定义的透射图。将t(x)和t̃(x)以其向量形式重写为t和t۫,我们最小化以下成本函数:

其中L是Levin参考文献[7]提出的Matting Laplacian矩阵,λ是正则化参数。第一项是平滑项,第二项是数据项。

矩阵L的定义如下:

其中I_i andI_j是输入图像I在像素第i和第j个点的颜色值,δ_{ij} 是克罗内克函数值(ij相等时为1,不相等时为0)。μ_k and Σ_k是窗口w_k中颜色的平均值和协方差矩阵,U_3是一个3×3的单位阵,ε是一个正则化参数,|w_k |是窗口w_k中的像素个数

最优的透射t可以通过求解以下稀疏线性方程来获得:


式中U是和L尺寸一致的单位阵。这里我们设置λ为一个很小的值(实验中设置为10-4)。这样t 会被 t̃ 软约束住。

Levin的Soft Matting 方法也已被Hsu等人[4]应用于处理空间变化的白平衡问题。在Levin和Hsu的作品中,t̃仅在稀疏区域中已知,而matting主要用于将值外推到未知区域。在本文中,我们使用Soft Matting来重新定义已填充整个图像的较粗t̃。


图5(c)是使用图5(b)作为数据项的软垫结果。正如我们所见,重新定义的透射图能够捕捉到尖锐边缘的不连续性,并勾勒出物体的轮廓。

根据这一节的公式,我们将上一节的透射图t̃,利用Soft Matting得到了新的更优的透射图t

4.3. Recovering the Scene Radiance

去雾的操作,由有雾图像计算出无雾图像

利用透射图,我们可以根据等式(1)恢复场景辐射亮度。但是当透射图t(x)接近零时,J(x)t(x)也会接近0。直接恢复的场景辐射亮度J容易产生噪声。因此,我们将透射t(x)限制为下限t_0,这意味着在非常密集的雾区中保留少量雾。最终场景辐射度J(x)通过以下方式恢复:

t_0的典型值为0.1。由于场景辐射亮度通常不如大气光那么明亮,因此去雾后的图像看起来很暗。因此,我们对去雾图像J(x)增加了一些曝光。图5(d)是我们最终恢复的场景辐射

效果出来了

4.4. Estimating the Atmospheric Light估计大气光

之前几节一直假定大气光的值A我们已知,这节就要介绍大气光的值是如何得到的

在以前的大多数单图像方法中,大气光A是从雾度最大的不透明像素估计的。例如,具有最高强度的像素在[16]中用作大气光,并在[2]中进一步定义。但在真实图像中,最亮的像素可能在白色汽车或白色建筑上。

正如我们在第3节中所讨论的,雾度图像的暗通道非常接近雾度密度(见图6(b))。我们可以使用暗通道来改进大气光估计。我们首先选择暗通道中最亮的0.1%像素。这些像素是最危险的(图6(b)中以黄线为界)。在这些像素中,选择输入图像I中具有最高强度的像素作为大气光。这些像素位于图6(a)中的红色矩形中。注意,这些像素在整个图像中可能不是最亮的。这种基于暗通道先验的简单方法比“最亮像素”方法更鲁棒。我们使用它来自动估计本文中显示的所有图像的大气光。

有些人使用原图中最白的像素作为大气,你就有可能选到图中的蓝框,就错了。而何恺明使用的是暗通道图像,找到暗通道图像中最亮的0.1%像素点,再从这些点中挑出在原图中最亮的点,效果会更好。

总结

本文对何恺明去雾的论文,进行了逐句详细的解析。内容虽全,但过于繁琐,下一篇将会将思想简单的理清,并给出python版代码的实现。

写的不容易,欢迎各位朋友点赞并加关注,谢谢!