图像增强、图像修复、图像去雾之间的关系

图像增强 强调主观标准,算法的结果是改善图像的质量。
图像修复 强调客观的标准,算法的结果是改善图像的质量。
图像去雾 图像增强和图像修复两种技术彼此交叉的典范,如果将雾霾看作是一种噪声,那么去除雾霾的标准显然是非常客观的,也就是将图像恢复到没有雾霾所获取的情况;如果将在雾霾环境下拍摄的照片看作是一种图像本来的面貌,那么去雾显然就是人们为了改善主观视觉质量而对图像所进行的一种增强。

暗通道的概念与意义

在绝大多数非天空的局部区域里,某些像素总会有至少一个颜色通道具有很低的值。换言之,该区域光强度的最小值是一个很小的数。下面给暗通道一个数学定义,对于任意的输入图像J,其暗通道可以用下式表达:

Jdark(x)=miny∈Ω(x)[minc∈(r,g,b)Jc(y)]
<script type="math/tex; mode=display" id="MathJax-Element-42">J^{dark}(x)=min_{y\in\Omega\left(x\right)}\left[min_{c\in\left(r,g,b\right)}J^c(y)\right]</script>
式中的 Jc <script type="math/tex" id="MathJax-Element-43">J^c</script>表示彩色图像的每个通道, Ω(x) <script type="math/tex" id="MathJax-Element-44">\Omega\left(x\right)</script>表示以像素x为中心的一个窗口。上式的意义用代码表达也很简单,首先求出每个像素RGB分量中的最小值,存入一幅和原始图像大小相同的灰度图中,然后再对这幅灰度图进行最小值滤波,滤波的半径由窗口大小决定,一般有WIndowSize=2*Radius+1。

暗通道的先验的理论指出:
Jdark→0 <script type="math/tex" id="MathJax-Element-45">J^{dark}\rightarrow0</script>
实际生活中造成暗原色中低通道值的因素有很多。例如,汽车、建筑物和城市中玻璃窗户的阴影,或者是树叶、树与岩石等自然景观的投影;色彩鲜艳的物体表面,在RGB的三个通道中有些通道的值很低(绿色的草地、树木等植物,红色或黄色的花朵、果实或者叶子,或者蓝色、绿色的水面);颜色较暗的物体或者表面,例如灰暗色的树干、石头以及路面。总之,自然景物中到处都是阴影或者彩色,这些景物图像的暗原色总是表现出较为灰暗的状态。

没有雾的正常图片暗通道的普遍性质。
正常图像的暗通道

有雾图像的暗通道。
有雾图像的暗通道

上述暗通道图像均使用的窗口大小为15x15,即最小值滤波的半径为7像素。

暗通道去雾霾的原理

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

I(x)=J(x)t(x)+A[1−t(x)]
<script type="math/tex; mode=display" id="MathJax-Element-86">I(x)=J(x)t(x)+A[1-t(x)]</script>
其中, I(x) <script type="math/tex" id="MathJax-Element-87">I(x)</script>为待去雾的图像, J(x) <script type="math/tex" id="MathJax-Element-88">J(x)</script>是要恢复的无雾的图像,参数A是全球大气光成分, t(x) <script type="math/tex" id="MathJax-Element-89">t(x)</script>为透射率。现在已知的条件是 I(x) <script type="math/tex" id="MathJax-Element-90">I(x)</script>,要求目标值 J(x) <script type="math/tex" id="MathJax-Element-91">J(x)</script>。根据基本的代数知识可知这是一个有无数解的方程。只有在一些先验信息基础上才能求出定解。

将上式稍作变形为:

Ic(x)Ac=t(x)Jc(x)Ac+1−t(x)
<script type="math/tex; mode=display" id="MathJax-Element-92">\frac{I^c(x)}{A^c}=t(x)\frac{J^c(x)}{A^c}+1-t(x)</script>
如上所述,上标 c <script type="math/tex" id="MathJax-Element-93">c</script>表示R<script type="math/tex" id="MathJax-Element-94">R</script>、 G <script type="math/tex" id="MathJax-Element-95">G</script>、B<script type="math/tex" id="MathJax-Element-96">B</script>三个通道的意思。

首先,假设在每个窗口内透射率 t(x) <script type="math/tex" id="MathJax-Element-97">t(x)</script>为常数,将其定义为 t~(x) <script type="math/tex" id="MathJax-Element-98">\tilde{t}(x)</script>,并且A值已经给定,然后对上式两边求两次最小值运算,得到下式:

miny∈Ω(x)[mincIc(y)Ac]=t~miny∈Ω(x)[mincJc(y)Ac]+1−t~(x)
<script type="math/tex; mode=display" id="MathJax-Element-99">\underset{y\in\Omega(x)}{min}[\underset{c}{min}\frac{I^c(y)}{A^c}]=\tilde{t}\underset{y\in\Omega(x)}{min}[\underset{c}{min}\frac{J^c(y)}{A^c}]+1-\tilde{t}(x)</script>
上式中 J <script type="math/tex" id="MathJax-Element-100">J</script>是待求的无雾的图像,根据前述的暗原色先验理论有:
Jdark(x)=miny∈Ω(x)[mincJc(y)]=0
<script type="math/tex; mode=display" id="MathJax-Element-101">J^{dark}(x)=\underset{y\in\Omega(x)}{min}[\underset{c}{min}J^c(y)]=0</script>
因此,可以推导出:
miny∈Ω(x)[mincJc(y)Ac]=0
<script type="math/tex; mode=display" id="MathJax-Element-102">\underset{y\in\Omega(x)}{min}[\underset{c}{min}\frac{J^c(y)}{A^c}]=0</script>
把上式的结论带回原式中,得到:
t~(x)=1−miny∈Ω(x)[mincIc(y)Ac]
<script type="math/tex; mode=display" id="MathJax-Element-103">\tilde{t}(x)=1-\underset{y\in\Omega(x)}{min}[\underset{c}{min}\frac{I^c(y)}{A^c}]</script>
这就是透射率 t~(x) <script type="math/tex" id="MathJax-Element-104">\tilde{t}(x)</script>的预估值。

现实生活中,即使是晴天白云,空气中也存在着一些颗粒,因此,看远处的物体还是能感觉到雾的影响。此外,雾的存在让人类感到景深的存在,因此在去雾的时候保留一定程度的雾。可以通过在上式中引入一个在 [0,1] <script type="math/tex" id="MathJax-Element-105">[0,1]</script>之间的因子来实现(例如0.95),则上式修正为:

t~(x)=1−ωminy∈Ω(x)[mincIc(y)Ac]
<script type="math/tex; mode=display" id="MathJax-Element-25">\tilde{t}(x)=1-\omega\underset{y\in\Omega(x)}{min}[\underset{c}{min}\frac{I^c(y)}{A^c}]</script>

上述推论中都是假设全球大气光 A <script type="math/tex" id="MathJax-Element-26">A</script>值是已知的,在实际中,可以通过暗通道图像来从有雾图像中获取该值。具体步骤大致为:首先从暗通道图像中按照亮度的大小提取最亮的前0.1%像素。然后,在原始有雾图像I<script type="math/tex" id="MathJax-Element-27">I</script>中寻找对应位置上的具有最高亮度的点的值,并以此作为 A <script type="math/tex" id="MathJax-Element-28">A</script>的值,至此,可以进行无雾图像的恢复了。

考虑到当前透射图像t<script type="math/tex" id="MathJax-Element-29">t</script>的值很小的时候,会导致 J <script type="math/tex" id="MathJax-Element-30">J</script>的值会偏大,从而使图像整体向白场过度,因此,一般可以设置一个 阈值t0<script type="math/tex" id="MathJax-Element-31">t_0</script>,当 t <script type="math/tex" id="MathJax-Element-32">t</script>值小于t0<script type="math/tex" id="MathJax-Element-33">t_0</script>时,令 t=t0 <script type="math/tex" id="MathJax-Element-34">t=t_0</script>(例如 t0=0.1 <script type="math/tex" id="MathJax-Element-35">t_0=0.1</script>)。因此,由第一个公式知,最终的图像恢复公式如下:

J(x)=I(x)−Amax[t(x),t0]+A
<script type="math/tex; mode=display" id="MathJax-Element-36">J(x)=\frac{I(x)-A}{max[t(x),t_0]}+A</script>

基于上述公式对图像进行去雾处理,所得结果如下所示:左上图为原始图像,右上图为暗通道图像,左下图为透射图( t~(x) <script type="math/tex" id="MathJax-Element-37">\tilde{t}(x)</script>),右下图经过去雾处理后的结果图像。

图像去雾效果

结果图中绿色植物(对应于暗通道图中颜色较深的部分)的边缘部分周围明显有不协调的地方,似乎这些部分没有进行去雾处理,这些都是由于之前求得的透射率图过于粗糙的原因导致的。

导向滤波求透射率图像

获取精细的透射率图,有soft matting方法,但是该算法速度特别慢,在实际应用中具有很大的局限性。导向滤波的方式获取透射图像,该方法主要过程集中于简单的盒子滤波,盒子滤波有相应的快速方法。
导向滤波后的去雾效果如下图所示,其中左图是精细化处理后的透射图,右图为最终去雾效果:

基于导向滤波的处理结果

现在结果已经比较细腻了,但是显然图像有些暗,通过对暗的图像加曝光和自动色阶,从而得到完美的去雾图像。

算法的不足之处

如果待处理图像中包含有大面积的天空,那么算法对图像中天空部分处理效果一般都不好。

参考资料

暗通道优先的图像去雾算法(上)
暗通道优先的图像去雾算法(下)

更多推荐