![14c0f00ae8ba3065518a497dc1033a17.png](https://img-blog.csdnimg.cn/img_convert/14c0f00ae8ba3065518a497dc1033a17.png)
更新:鉴于很多人要代码,我把利用tensorflow搭建模型以及四叉树分解图像的代码放在文章最后了,需要的可以参考。完整的代码见:OpenASIC
本文章中提到的基于直方图匹配的去雾方法主要基于我的ISCAS会议论文:Single Image Dehazing Using a Novel Histogram Tranformation Network
本文分为两个部分,第一部分简洁地介绍一下主流的一些去雾方法(主要是各种种类,不具体介绍具体的哪个方法),熟悉的人可以直接跳到第二部分。
一、主流的去雾方法
![fc4bf5b7a6200e6facfbcafb232be7db.png](https://img-blog.csdnimg.cn/img_convert/fc4bf5b7a6200e6facfbcafb232be7db.png)
日常生活中,我们能看到一个物体,是因为物体反射光线进入我们的眼睛。而物体反射光线在大气传播时,会受到颗粒物的影响,传播方向改变,向多个方向散射。大气散射现象阐明了雾天图像变模糊的原因,因此也为去雾的研究提供了切入点。
相关科研领域中,目前最为广泛使用的是由McCartney等人提出的大气散射模型。该模型的原理如图1所示。
我们可以根据图1所示关系推导出成像设备处接收到的像素值的表达式,用以下公式表示:
其中,x为图像中某一像素点的坐标。I(x)表示进行图像去雾操作前的输入图像x坐标像素的像素值。因此,I表示一整幅完整的图像。对于灰度图,每个像素点的像素值介于[0,255]之间,I是一个二维矩阵;对于RGB图像,那么x点的像素值由R、G、B三通道的像素值组成,因此I是一个三维矩阵。公式中的J(x)t(x)项用于描述物体表面的反射光线经散射后传到成像设备,对图像上x坐标处像素点的影响,其中J(x)表示消除大气中各种悬浮颗粒干扰后的无雾清晰图像;t(x)表示考虑了大气中悬浮颗粒影响后的x处物体表面的反射光线的传输率。t是一个大于0,小于1的值,如果图像中某一像素点处的t值为0,则表示雾的浓度无限大,该像素点所在位置处的反光完全无法传输到成像设备;如果图像中某一像素点处的t值为1,则表示反射光线可以不经过任何折射到达成像设备,反射的光线直接被成像设备接收。公式右边的第二项,即A(1-t(x))用于描述其余物体反射光线经过悬浮颗粒折射后,在x处成像的综合,其中A表示大气光照强度,由于通常在一场景中大气光照变化不大,所以我们可以认为A不随x变化。各种光线经过不同路径进行混合,叠加后往大气光照进行偏移,使得获取真实场景信息变得困难。
要从有雾图像得到无雾图像,即已知I(x),要求出J(x)。通过式(1),我们可以发现若我们能够得到大气光照A和传输率t(x),则清晰图像就可由下述公式求得:
基于大气散射模型去雾,核心就在于估计大气光照以及传输率。目前,估计大气光照以及估计传输率,主要依靠一些人工的假设(如暗通道假设)或者CNN(主要是估计传输率)进行。基于人工假设来估计大气模型可以大大减少计算量,但往往仅在特定情况下生效(假设成立时),比如说暗通道假设在图像中没有大面积高亮物体时才成立。基于CNN来估计大气模型可以应对更对地场景,但是由于最后还是通过(2)式这样简单地式子来恢复图像,依然会在部分区域表现不好(比如大气光照不为白色,RGB三通道传输率不同等)。
除了先估计大气传输模型的参数,现在越来越多的研究者也转向利用神经网络直接进行端到端的去雾。这些网络效果更好,但是因为不依赖大气模型辅助,网络模型往往更为复杂,计算量较大。
二、基于直方图匹配进行去雾
接下来介绍下我的研究。
在各种假设出现之前,去雾主要依靠增强图像对比度地方法进行,比如对图像进行直方图均衡化。单纯增强图像对比度可以帮助人们看清图像内容,但是颜色失真很严重。
那么,如果我们单纯知道图像无雾情况下的直方图,拿无雾的直方图对有雾图像进行直方图匹配可以去雾吗?我们做了一个实验:
- 从网上的去雾数据集中获取一张无雾图片,以及人工加雾结果
- 获得两张图像的直方图
- 用无雾图像直方图对有无图像进行直方图匹配,得到去雾图像。这里需要注意的是,直方图匹配的时候需要分块进行(具体的分块方法在之后介绍),原因是,雾在图像不同区域的浓度是不同的,统一进行匹配的话相当于对所有像素运用相同的一套映射,没法有效去雾。
下面给出一个例子:
![91b4fa3a4e3ae16af3fd0893a4a0ff7a.png](https://img-blog.csdnimg.cn/img_convert/91b4fa3a4e3ae16af3fd0893a4a0ff7a.png)
图2所示为实验结果,这里为了方便观看结果,不列出分块的直方图,只是对分块匹配好的图像统一计算直方图。可以看到通过直方图匹配能较好地从一副有雾图像中得到去雾图像。有雾图像的直放图和无雾图像的相比,分布范围更小,且更偏向亮的区域,这符合我们的直觉,因为有雾图像白色区域更多,对比度较小。利用无雾图像的直方图对有雾图像进行规定化之后,去雾图像的直方图变得和无雾图像十分接近,事实也证明去雾图像和无雾图像很接近。
那么,我们怎么得到无雾图像的直方图呢?我的做法是训练一个一维的卷积神经网络进行无雾图像直方图的预测。网络的结构和算法的流程如下图所示:
![a1cd4efb88080a3cbddf94c20092ea7c.png](https://img-blog.csdnimg.cn/img_convert/a1cd4efb88080a3cbddf94c20092ea7c.png)
算法的详细步骤如下:
- 对图像进行四叉树分解:之前提到了,由于雾对不同区域影响不同,需要分块进行直方图匹配。所以这一步,目的就是将图像中雾浓度接近的区域划分到同一个区块内,一起匹配。分解时,先将一幅图像等分成四个区域,然后分别计算四个区域内像素值的方差,当方差较大时,说明内容比较丰富,继续将该区块等分成四份。。。递归进行上述操作,直到方差小于一个阈值时停止细分。
![ac9804f10ece702f5eb7f42ea4d45d5e.png](https://img-blog.csdnimg.cn/img_convert/ac9804f10ece702f5eb7f42ea4d45d5e.png)
2. 计算该区块的灰度直方图
3. 通过我们的直方图变换网络,预测无雾结果的直方图
4. 对该区块进行直方图匹配
5. 对所有区块执行完上述步骤后,用导向滤波器(image guided filter)对图像进行滤波,去除区块间的不自然过渡 。滤波时,将有雾图像当作引导图。
下面展示一下本方法的去雾效果,参与比较的几个算法分别来自:
[1] He, Kaiming, Jian Sun, and Xiaoou Tang. "Single image haze removal using dark channel prior." IEEE transactions on pattern analysis and machine intelligence 33.12 (2010): 2341-2353.
[2] Meng, G., Wang, Y., Duan, J., Xiang, S., & Pan, C. (2013). Efficient image dehazing with boundary constraint and contextual regularization. In Proceedings of the IEEE international conference on computer vision (pp. 617-624).
[3] Ren, Wenqi, et al. "Single image dehazing via multi-scale convolutional neural networks." European conference on computer vision. Springer, Cham, 2016.
[4] Ren, Wenqi, et al. "Gated fusion network for single image dehazing." Proceedings of the IEEE Conference on Computer Vision and Pattern Recognition. 2018.
![553cb06f08f898b8ef94b640c909123b.png](https://img-blog.csdnimg.cn/img_convert/553cb06f08f898b8ef94b640c909123b.png)
![980b70caf0458b74703ec150ee9f739d.png](https://img-blog.csdnimg.cn/img_convert/980b70caf0458b74703ec150ee9f739d.png)
![62a0cd77112caa014aa757d9ec64cdbc.png](https://img-blog.csdnimg.cn/img_convert/62a0cd77112caa014aa757d9ec64cdbc.png)
可以发现,本算法在SSIM以及色差方面表现都很好,并且计算速度非常快。这主要是由于,本文中的网络中所有的数据都为一维数据,相比其他基于CNN的网络,大幅度减少了运算量。之所以只预测直方图的变换,就能实现去雾,我认为原因是雾气对图像的影响更多体现在色彩上,而不会影响图像中物体的边缘,所以在恢复时只需要预测图像中像素的重排列就可以很好地去雾。边缘信息,则在导向滤波器时,通过将有雾图像作为引导图像恢复出来。
以下为一些关键的代码部分,主要是四叉树如何构建,以及网络的搭建,网络搭建使用tensorflow。
#四叉树
#模型