描述

本文会对何恺明博士的论文实验结果进行分析,并结合我的复现代码,对一些参数选择给出建议

以下是我关于去雾的另外两篇文章:
论文解析:https://www.guyuehome.com/39848
思路梳理与python代码复现:https://www.guyuehome.com/39850

原文分析

5. Experimental Results

自己的结果

在我们的实验中,我们使用Marcel van Herk的快速算法[17]来做局部的最小化,其复杂度与图像大小成线性关系。对于600×400图像,patch大小设置为15×15。在Soft matting中,我们使用预条件共轭梯度(PCG)算法作为解算器。在配备3.0 GHz英特尔奔腾4处理器的PC上处理600×400像素的图像大约需要10-20秒。



图1和图7显示了我们的烟雾去除结果和恢复的深度图。使用方程(2)和一个未知的缩放系数β,我们可以计算出深度图。使用第4.4节中描述的方法来自动估计这些图像中的大气光A。可以看出,即使在非常密集的雾区,我们的方法也显示细节并恢复出很好的色彩。方法估计的深度图也很清晰,并且与输入图像一致。去雾的另一个操作,就是同时得到深度图,这点很妙,之后会解释

与他人的比较

在图8中,我们与Tan[16]的工作进行了比较。他的结果的颜色通常过饱和,因为他的算法不是基于物理的,透射率过低。我们的方法可以在不牺牲颜色保真度的情况下恢复结构,并且光晕伪影也非常小。光晕下面会分析

结果优于参考文献[16]

这张图片与参考文献[2]的差异不大

浓雾情况下优于参考文献[2]

接下来,我们与Fattal[2]的工作进行比较。在图9中,我们的结果与Fattal的结果2相当。在图10中,我们表明,在浓雾的情况下,我们的方法优于Fattal。Fattal的方法基于统计学,需要足够的颜色信息和方差。如果雾度较浓,且方差不足以使他的方法可靠地估计透射,他的结果颜色就会偏暗。图10(b)和(c)显示了使用MRF模型前后的结果。发现即使在MRF之后,也只能可靠地恢复部分透射,因此这些区域中山脉太暗,远处城市景观的烟雾又无法消除。相反,我们的方法在这两个区域都适用(图10(d))。

我们还将我们的方法与Kopf等人的最新工作[5]进行了比较,如图11所示。为了消除烟雾,他们使用场景的3D模型和纹理贴图。这些附加信息可能来自谷歌地球和卫星图像。然而,我们的技术可以在没有任何几何信息的情况下从单个图像生成可比较的结果。

参考文献[5]使用了其他输入信息,我们不需要

如果图像中有足够的阴影区域,我们的方法甚至适用于灰度图像。我们省略了算子min_c,并使用了Soft matting的灰度形式[7]。图12显示了一个示例。

我们的方法还可以干灰度图

6. Discussions and Conclusions

在本文中,我们提出了一种非常简单但功能强大的先验,称为暗通道先验,用于单图像去雾。暗通道先验基于室外图像的统计。将先验应用到雾度成像模型中,单图像去雾变得更简单和更有效。

由于暗通道先验是一种统计,它可能不适用于某些特定图像。当场景对象本质上与大气光相似,并且没有阴影投射在它们上时,暗通道先验无效。我们的方法将低估这些对象的传输,如图13中的白色大理石。

失败情况,大理石也变成黄色了

我们的工作也分享了大多数烟雾去除方法的共同局限性-烟雾成像模型可能无效。更先进的模型[13]可以用来描述复杂的现象,如太阳对天空区域的影响,以及地平线附近的蓝色色调。我们打算在未来研究基于这些模型的烟雾去除。

我的python实现

按照论文的思想,我进行了复现,主要想亲自体验下何大神的神作。

代码我写在了这篇文章中https://www.guyuehome.com/39850

这里就不贴了

工程中出现的bug

论文并不复杂,代码也很简单,我没有花太多时间来复现。但是,我确实花了不短的时间,来解决上图出现的问题。

如图所示,结果十分糟糕。上图是在没有进行soft matting的情况下得到的,在天安门周围可以很清晰的看到轮廓,这也就是论文里提出的光斑。但显然光斑的颜色并不正确,而最主要的错误是图中出现了一些乱颜色。

最后我找到了bug所在,也怪在我粗心且python功底不扎实

我的错误写法:

image_noHaze[i][j] = (image[i][j] - A) / max(0.1, t_x[i][j]) + A

错误在两点:1.是没有注意到image利用cv2读出来的格式是uint8,直接减去A的情况下,并不能表示负数。而事实是,该结果有可能为负。 2. 是没有对计算出的结果进行限制,如果选择到一个(255, 255, 255)的大气光,结果是有可能超出通道范围的。

我最后的写法是这样的:

image_noHaze[i][j][0] = max(min((int(image[i][j][0]) - int(A[0])) / max(0.1, t_x[i][j]) + int(A[0]), 255), 0)
image_noHaze[i][j][1] = max(min((int(image[i][j][1]) - int(A[1])) / max(0.1, t_x[i][j]) + int(A[1]), 255), 0)
image_noHaze[i][j][2] = max(min((int(image[i][j][2]) - int(A[2])) / max(0.1, t_x[i][j]) + int(A[2]), 255), 0)

可以解决图中的错误颜色了。

我的实验结果分析

1. 去雾效果

原始图像

暗通道图像

透射率图像

去雾效果

2. soft matting的作用

我采用的是导向滤波,不过这是不影响分析的。

原图

没有对透视率进行优化,去雾效果会有光斑(树那里)

优化后光斑消失

3. 错误的大气光估计

原图

去雾效果:实际上并不正确,全图颜色偏蓝,原因是大气光错误的选择到了中间那个白色建筑物。这一点和何博士举的大理石例子,失败情况与原因相同

4. 一些非常不错的结果




关于论文思想的最后

宏观的再看这篇文章,我们对一些问题会有更清晰的认识。何博士这篇文章的妙就在,通过了一种非常简单的方法,解决了去雾:

  1. 去雾操作的一句话简述,就是在图中找到一个像素点代表大气光,然后利用这个点来去雾

  2. 暗通道的发现,是论文的核心点。究其缘由,我的理解是:数据集或者说大自然的各种物体,颜色鲜明的占大多数,故而会有暗通道这一先验生效。这是我的看法。

  3. 方法中的soft matting及之后的导向滤波,虽然对整体结果影响不大,但是对细节的恢复至关重要。用我代码的实验效果,很好的说明了这一点

  4. 注意到,本方法在去雾的同时还能提取深度图。虽然得出的距离并不是准确的,但从深度图可以看出,基于物理模型的去雾的确是有理论依据的。另外这种方法,也可以延伸去做更多的事情,例如有些人用这种方法来恢复黑暗中的场景图像。

  5. 论文也有不足:其效果会受到参数的影响,也会受到输入图像的影响。

总结

何博士暗通道去雾的最后一篇文章了。

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