何凯明博士在09年以 “Single Image Haze Removal Using Dark Channel Prior” 一文技惊四座。此文甚至成为09年的CVPR最佳论文。本篇博文将对这种去雾算法进行简要的分析,并通过自己的实现来更好的进行介绍。
算法核心介绍
Foggy Image model
首先,我们需要构建一个雾天图像的模型。公式如下所示,其中I表示雾天图像,J表示没有雾的图像,t表示空气穿透率,A表示纯雾。式子中的x均表示为图像中的像素点。
上式非常容易理解:我们最终看到的雾天图像是由透过空气传递过来的原始景观图像和一定浓度的雾叠加而成。
而作为去雾,我们是要依据已有的雾天图像I来得到原始的景观图像J,这就需要利用暗通道原理来求得模型中的空气穿透率t。
暗通道
基于观察,何凯明博士提出了这样的假设:自然界中的大部分非天空物体,其rgb三个颜色通道中至少有一个值非常低,其表达式如下所示:
其中Ω为x*x的像素方块。
下图是先取图像中三个通道的最小值构成一张灰度图,然后在做一个一定窗口大小的最小值滤波,最终得到暗通道处理图。
通过处理图片我们可以清晰看出,除了白色的部分(三通道的值都比较大),其余部分的暗通道值很小,近似符合暗通道趋向0的假设。
去雾模型推导
对于雾天模型的公式,我们现在做如下处理:
为了得到最终的去雾图像,我们需要求得t和A。推导过程如下所示:
由于即便在正常的天气中,原始景观传过来的时候也是经过了一定浓度的大气(可以认为是雾)。
而对于参数A,我们是这样计算的:选取一定区域内亮度最大的值作为A(理论上认为纯雾接近纯白)
这样就将t和A的值分别求了出来,从而得到去雾后的图像J。
采用这样的方法得到的图像如下所示:
由于在图像处理的过程中都不是基于一个像素而是一个像素集合的方块进行的,所以实际得到的图像中物体边缘会有比较明显的白边的存在,而对于这种现象,何凯明博士先后提出了两种理论予以解决。
去除伪影
Soft Matting 2009
该方法较为复杂,且处理较慢,早已不用,本文不做赘述
Guided Filter 导向滤波 2011
导向滤波先做了一个如下的先验假设:所有邻近的点之间都是线性的,同时任何方程在局部的小段都可以认为是线性的。
经过推导可得:
其中q为输出图像,I为输入图像,p为滤波图像。i和k都是像素index,a和b是线性参数。在导向滤波中,I可以为任何导向图像
上述式子的一大优点就是其可以保护边界值。
通过上述式子我们可知,当像素强度变化不大时,a趋向于0而b等同于窗口的均值强度。等同于做一个均值滤波。
而当强度变化大时,a趋向于1而b趋向于0。等同于不做滤波,保留边界。
对之前的两张图片进行导向滤波处理,我们可以得到较好的结果。
总结
最后我将展示一些去雾的效果:
去雾算法在处理非天空的自然物体时效果很好。如图:
同时在处理城市建筑时也有着不俗的表现。如图:
但是同时其也有着一些不足之处
比如在处理以白色物体为背景的图像时,会出现去雾效果不好以及色彩偏蓝的现象。这主要是因为去雾算法是基于暗通道值趋向为0的先验假设,而白色背景是不符合这种先验假设的,由于不符合物理模型所以才导致出错。如图:
此外当雾太厚的时候,还会出现过曝的情况,这是由于穿透参数t很小,根据之前的推导,我们会得到一个较大的J(x)。这才导致了过曝的现象。如图:
所以总而言之,去雾算法可以取得一个比较好的效果,不过也有其一定的局限性,要视具体的情况而定。
想要上手参考的,详见我的github