本文翻译于何凯明博士的《Single Image Haze Removal Using Dark Channel Prior》这篇文章。
背景
在计算机视觉和计算机图形学中,广泛用于描述雾图像形成的模型如式(1)所示:
其中I为观测图像(待去雾图像),J为无雾图像(待恢复的图像),A为全球大气光成分,t为透射率。去除雾霾的目标是从I中恢复J,A和t对于N个像素的彩色图像I,存在3N个约束和4N+3个未知数。这使得雾霾清除的问题本质上不明确。
式(1)中等式右侧的第一项被称为直接衰减,第二项被称为空气光,直接衰减描述了场景辐射及其在介质中的衰减,空气光由之前的散射光产生并导致场景颜色的转变。 虽然直接衰减是场景辐射的乘法失真,但是空气光是一种加性失真。
当大气均匀时,透射率t可以表示为:
其中,β为大气的散射系数,d为场景深度。等式表面,透射率随场景深度呈指数变化。如果我们能够恢复转化关系,就能将场景深度恢复到未知的范围。
在几何学中,雾霾图像式(1)表示:在RGB彩色空间中,矢量A(x)、J(x)、和t(x)是共面的,他们的终点是共线的如图1(a)所示。透射率t是两条线段的比率:
其中c{r,g,b}是颜色通道索引。
图1
(a) 雾霾图像模型;(b)法塔尔工作中使用的恒定反照率模型
暗通道先验
暗通道先验基于以下户外无雾图像的观察:在绝大多数非天空图像区域中,至少有一个通道具有强度非常低且接近于零的像素。因此,这些最小强度像素值接近于0。
为了正式描述这个观测结果,我们首先定义一个暗通道概念。对于任意图像J,其暗通道Jdark定义为:
式中Jc是图形J的颜色通道,Ω(x)是以x为中心的一个局部块。暗通道是两个最小运算的结果,在每个像素上执行(如图2(b)),是最小滤波器(如图2(c))。最小操作符是可互换位置的。
图2暗通道计算
(a)任意图像J;(b)每个像素,计算得到的(r,g,b)的最小值;(c)最小滤波器在b图上操作后的结果;Ω的大小为15*15
根据暗通道的定义,研究表明,如果图像J是户外非天空的无雾霾图像,则J的暗通道强度很低,并趋于于零:
Jdark -﹥0.(5)
我们称之为暗通道先验。
暗通道中的低强度主要由三个因素造成:a)阴影,例如城市景观图像中车辆,建筑物和窗户内部的阴影,或者景观图像中树叶,树木和岩石的阴影; b)多彩物体或表面,例如任何颜色通道(例如,绿草/树木/植物,红色或黄色花朵/叶子和蓝色水面)中具有低反射率的任何物体将导致暗通道中的低值; c)暗的物体或表面,例如暗的树干和石头。 由于自然室外图像通常是丰富多彩的阴影,这些图像的暗通道真的很暗!
实验通过测试户外景观等无雾霾图像,共5000幅,结果表明,75%的暗通道像素强度为0,90%的暗通道像素强度低于25。这一数据为之前的暗通提供了有力支持。
由于附加空气光,雾霾图像比透光率低的非雾霾图像在视觉上更亮,因此雾霾图像的暗通道在雾霾密度较高的地区具有较高的强度。从视觉上看,暗通道强度是对雾霾强度的粗略近似。
利用暗通道先验消除雾霾
估算透射率
首先假设大气光A已经给出,将雾霾成像方程归一化为:
注意,将每个颜色通道单独归一化。
假设局部区域Ω(x)的透射率是恒定的,将其计为,然后计算公式(6)两边的暗通道。然后在等式两边求两次最小运算:
因为是常量,所以可以放在最小运算符的外面。
由于图像J是没有雾霾的图像,由暗通道先验可知J的暗通道接近于0:
由于Ac是常数,所以存在:
将式(9)带入式(7),可以简单的消除乘法项并估算透射率:
事实上是归一化雾霾图像的暗通道,直接估算出了透射率。
正如之前提到的,暗通道先验对于天空区域并不是好的先验。幸运的是,在雾霾图像I中,天空的颜色通常与大气光A相似,因此在天空区域中有:
这时式(10)中。
实际上,即使在晴朗的日子里,也大气并不是完全没有任何微粒。所以当我们看远处的物体时,阴霾依然存在。此外,阴霾的存在是人类感知深度的基本线索。这种现象被称为空中透视。如果我们彻底消除阴霾,图像可能看起来不自然,我们可能会失去深度感。因此,通过引入一个常量参数,我们可以选择为远处的物体保留极少量的雾霾:
这种设置的好处是,我们可以自主的为远处的物体保留更多的阴霾,本文将其设置为0.95。
在暗通道先验的帮助下,乘法项被丢弃,并且加性项足以估计透射率。我们可以进一步概括式(1)为:
其中t1、t2不同。利用退到公式(11)的方法,可以估计t2并分离加性项。问题被简化为乘法形式(J(x)t1),其他约束或先验可以用来进一步分解这个项。在人们研究的视觉文献中,这个加性项被称为炫光亮度。式(13)可以用来描述通过面纱或高光炫光看到的场景。
估算大气光
我们一直假设大气光A是已知的,在本节我们提出一种估算A的方法。在之前的方法中 ,将最不透光区域的颜色被用作A或者A的初始猜测值,然而却很少关注最不透光区域。
在Tan的研究中,雾霾图像中最亮的像素被认为是最不透明的像素,这种观点只有当阴天,阳光可以忽略的情况下才成立。事实上大气光是场景的唯一光源,因此每个颜色通道的场景辐射度表示为:
其中R<1是场景点的反射率,雾霾公式(1)可以写成如下形式:
当图像中的像素在无穷远距离时,最明亮的I是最不透明的,其近似等于A。然而,实际上我们不能忽略太阳光,考略到太阳光,将公式修改为:
式(15)表示为:
在这种情况下,整幅图像的最亮像素可能比大气光强更亮,他们可以是白色墙上或者汽车上的像素。
如前面讨论的,雾霾图像的暗通道接近雾霾密度,因此可以使用暗通道来检测最不透光区域,并改善大气光的估计值。我们首先选取暗通道最亮点0.1% 的像素,这些像素通常是最不透光的像素,在这些像素中,输入图像I中具有最高亮度的像素选出来作为大气光。请注意这些像素在整幅图像中可能不是最亮的。
无雾霾图像恢复
根据大气光和透射率,利用式(1)可以恢复无雾图像。但是当透射率t接近于0时,直接衰减项J(x)t(x)非常接近于0,直接恢复的场景图J很容易产生噪声。因此我们可以通过下线阈值t0来限制透射率,在雾霾非常密集的区域保持少量雾度。最终无雾图像恢复为:
本文t0的值设置为0.1。因为场景图的辐射通常不像大气光那样明亮,所以去雾霾后的图像看起来比较暗淡,因此我们对回复的图像增加了曝光量。
最小模板区域设置
模板的区域大小是算法的重点。一方面,模板区域越大暗通道先验效果越好,因为区域越大包含暗像素的概率越大,即尺寸越大,暗通道越暗;模板尺寸越小,暗通道先验不够准确,恢复的场景辐射过饱和。另一方面,透射率在模板尺寸计算中不变并不令人信服。本文窗口尺寸用15*15。
以下是github上的来源代码:
matlab: https://github.com/mchengny/Haze_Removal_for_Image_Preprocessing
python: https://github.com/jiguang123/haze