暗通道去雾化报告
#1.课题简述
在不包括天空的大部分部区域内,至少有一个颜色通道的一些像素,它的强度值是非常低或者接近于0。与此同时,在这些区域内,最小强度值也是接近于0。暗像素能够直接用来评估雾光的透射信息
##1.1课题目的
对一张有雾化的图片进行,除去雾处理得到一张“干净”的图片。
去雾的目标就是从I中复原J,A,t。
I(x)=J(x)t(x)+A(1-t(x)),
I(x):观测到的图像的强度
J:景物光线的强度
A:全球大气光成分
t:用来描述光线通过媒介透射到照相机过程中没有被散射的部分
##1.2 项目环境
使用的是OpenCV的python环境
##1.3 基本流程
###1.3.1暗通道
在不包括天空的大部分部区域内,至少有一个颜色通道的一些像素,它的强度值是非常低或者接近于0.与此同时,在这些区域内,最小强度值也是接近于0.我们可以用一个公式来描述这个现象,并且我们把这个定义为暗通道的概念。
:是J图片的一个有颜色的通道
是以一个x为中心的方形区域
暗通道是有两个最小值化的操作构成的:
指的是在rgb三个像素值中选出最小的操作
是一个迷你滤波器
在进行编码的时候,我们需要安装PIL库,它可以帮助我们直接从图片中提取像素值。但是,在2009年的时候,该公司停止了对其更新,由非工作人员对其进行维护,现在改名为pillow.
###1.3.2估计透射率分布
通过下面的公式可以提供透射率分布的估计
是对在暗通道中对雾化图片的归一化。
代表雾化图片
有些时候,我们彻底的把雾化去掉,这样反而使得图片失去真实感并且深度感也会丢失。所以我们可以保留一些远距离物体的雾。在这里我们使用w来保留一部分覆盖遥远的雾。w值得选取根据具体情况而定,在本论文中选取0.95.
###1.3.3估计大气光
从之前的论文中知道,在彩色图片中雾气浓度最高的区域被认为是A。我们可以使用暗通道去检测雾气浓度最高的区域并且改善大气光的估计。首先,我们在暗通道中选取最亮的前0.1%的像素点。这些像素点代表雾气浓度最高点。再在这些像素点中,选取最高强度的像素点,确定其位置对应到输入图像中,这样就求得了A。
值得注意的是,这些像素点可能不是输入图像中最亮的点。
###1.3.4复原物体光线
将上面求得的值,代入公式中,就可以复原图片了。
但是,如果透射率接近于0,那么复原J图的时候就会产生噪音。因此,我们用Tt0来限制透射率,使得其最低不能低于0.1.
#2.优化算法
##2.1:软抠图算法
我们用软抠图算法来完善透射率分布函数。
###2.1.1首先我们通过和公式相比较。透射率分布实际上就是的分布。
###2.1.2重新把t(x)和用向量的形式重新写成t和:
L:抠图拉普拉斯矩阵
:修正后的参数
###2.1.3元素(i,j)的L矩阵的定义如下:
、:输入图像的I在像素i, j处的彩色
:克罗内克函数(输入两个值,如果相等输出为1,否则输出等于0)
、:分别是窗口中彩色矩阵的平均值和方差
: 3*3的单位矩阵
:修正参数
:在窗口像素的数目
###2.1.4最优的t可以通过稀疏线性系统得到:
U:一个和L矩阵大小一样的单位矩阵
:在实验中取
##2.2导向滤波
何博士为了能得到更为细腻的效果,提出”soft matting”方法来精细化透射率,但是这个算法的一个致命的弱点就是速度特别慢,因此在实际的工作中会非常影响效率。
作者在2011年的论文中,提出了导向滤波这一概念,来获得更为高效的透射率。
这个方法使用了盒子滤波,并且盒子滤波又有相应的快速算法,因此实用性较强。
导向滤波原理:某函数上一点与其邻近部分的点成线性关系,一个复杂的函数就可以用很多局部的线性函数来表示,当需要求该函数上某一点的值时,只需计算所有包含该点的线性函数的值并做平均即可。这种模型,在表示非解析函数上,非常有用
###2.2.1
我们希望引导图像提供的是信息主要用于指示哪些是边缘哪些是区域,所以在滤波时,如果引导告诉我们这里是区域,那么就要将其磨平。如果是边缘,就要设法保留这些边缘信息。只有I和q之间线性关系这种引导才有意义。
假设该函数的输出和输入在一个二维窗口内满足线性关系:
a, b:当窗口中心位于k时该线性函数的系数
I:输入图像的值
i,k:像素索引
q: 输出像素的值
###2.2.2
线性回归:拟合函数的输出值与真实值p之间的差距最小,求下面公式最小:
p:待滤波图像
###2.2.3 通过最小二乘法
:I窗口中的平均值
:I窗口中的方差
:窗口中像素的数量
:待滤波图像p在窗口中的均值
###2.2.4
在计算每个窗口的线性系数时,一个像素会被多个窗口包含,也就是,每个像素都由多个线性函数所描述。就像之前所说的一样,要具体求某一点的输出值,只需要将所有包含该点的线性函数值平均即可:
:所有包含像素i的窗口
K:窗口的中心位置
#3.结果分析
对下面图像进行去雾化处理,
经过暗通道的处理:可以从图中观察将之前彩色图中颜色较深的区域转化为黑色区域。
通过导向滤波算法,对图像进行更加细腻化的处理。可以从这幅图与上一幅图相比较中观察到:显然,从发丝到背景都变得更加平滑和细腻
去雾化之后的图片,可以明显的看见图中的女孩的脸更加清晰和红润。但是,女孩周围的雾气并没有去掉,去雾效果并不算太好。经过观察可以发现其实在原图中,女孩周围的雾气不是特别的纯正(含杂质较多)。
担心可能是图片的问题,所以对另外一张有雾的图片进行处理。
从上面的图片可以观察出,实际上去雾化效果非常的好,但是由于光线的原因,图片整体偏暗。
#4.现在的问题
##4.1 在这次论文的研读中,我着重把心思花在了从论文中如何进行编程
首先,我在网上查询别人通过这几篇论文如何进行编码的,网上大部分是c++的。
然后,尝试着自己去理解代码,通过自己的理解然后使用python写出来。
问题:对c++代码理解存在非常大的问题,还有就是c++思路和python的思路(因为有些功能用c++实现非常繁琐,而用python是非常的)完全是两个概念,所以在这个方面上花费了非常多的时间。
解决:首先论文中的公式,它的输入到底是什么,是像素,数组还是一个值。
然后如何用python去得到它的输入
##4.2以下是我编码中所犯的错误(有很多错误,以下为典型的错误)
###4.2.1
忽略了窗口大小问题,导致图像成为以下这样:
可以观察出来,使用了窗口图片,更加细腻。在何博士的论文中,使用的是15*15大小的(下图)
###4.2.2
在阅读论文的时候,没有弄清楚到底light(A)是什么,一个值?一个数组?还是一个矩阵?这个导致伪代码中的第二步无法实现,而且导致在编码的过程中逻辑混乱
#5.参考文献
[1]Tan R T. Visibility in bad weather from a single image[C]// Computer Vision and Pattern Recognition, 2008. CVPR 2008. IEEE Conference on. IEEE, 2008:1-8
[2]R. Fattal, “Single Image Dehazing,”Proc. ACM SIGGRAPH ’08, 2008.
[3] A. Levin, D. Lischinski, and Y. Weiss, “A Closed Form Solution to Natural Image Matting,”Proc. IEEE Conf. Computer Vision and Pattern Recognition, vol. 1, pp. 61-68, 2006.
[4] I. Omer and M. Werman, “Color Lines: Image Specific Color Representation,”Proc. IEEE Conf. Computer Vision and Pattern Recognition, vol. 2, pp. 946-953, June 2004.