
代码:https://github.com/danaberman/non-local-dehazing
本文中关于雾线的思想,和Meng(BCCR)方法中“推向论”的思想有异曲同工之妙。
1. 摘要
本文提出了一种基于Non-Local先验的算法。 该算法基于以下假设:无雾图像的颜色可以很好地近似为数百种不同的颜色,这些颜色在RGB空间中形成紧密的簇。 通过观察发现,这些簇中包含的像素通常是非局部的,即他们分布在整个图像平面上,并且与相机的距离不同。在有雾的情况下,这些不同的距离转化为不同的传输系数。因此,清晰图像中每中颜色簇在雾图的RGB空间中为成为一条线(Meng:清晰像素在雾的影响下,被“推向”了大气光)。 使用这些雾线,本文提出的算法可以恢复传输率图和无雾图像。
2. 先验
本文方法基于以下观察:图像中不同颜色的数量比像素的数量小几个数量级。使用K-means算法将一幅图像的RGB像素值聚类为500个聚类,并将图像中的每个像素替换为其所属聚类的中心像素。结果如下:

图1 量化前后对比
可以看到,肉眼无法分辨其中的差别。
图2(b)中展示了无雾图像中四个聚类,分别用四种颜色表示。其在原图中的像素用相同颜色的标出。可以看到证实了作者的观察:这些簇中包含的像素通常是非局部的,即他们分布在整个图像平面上,并且与相机的距离不同。 当给无雾图像渲染雾后,聚类中的点被延申成了一条线,即作者提出的雾线。不太理解的同学可以看我写的Meng(BCCR)方法的博客,里面介绍了“推向论”的思想。简单来说,就是无雾情况下,I(x)≈J(x),在雾的渲染下,t(x)减小,导致I(x)=t(x)J(x)+(1−t(x))A,J(x)的成分减少,A的成分增加。雾线的一端是J(x)(图2(d)中的彩色点),一端是A(图2(d)中的黑色点),所以像素点由J(x)被推向了A。因为聚类中的点的距离各不相同,雾的影响效果也各不相同(雾主要是通过深度来影响),所以雾线中点的分布也各不相同。

图2 雾线示例图
3. 去雾方法
算法一共四步,即1) 将像素聚类成雾线,2) 估计初始传输率,3) 正则化,4)去雾。算法过程如下:

3.1 Finding Haze-Lines
本文使用的估计大气光的方法:“Air-light Estimation using Haze-Lines”, ICCP 2017。
定义如下变量:
IA(x)=I(x)−A(1)
即将3D RGB 空间坐标系转换成原点为大气光的坐标系。结合大气散射模型,得到:
IA(x)=t(x)⋅[J(x)−A](2)
同时,可以将IA(x)用球系坐标系表示:
IA(x)=[r(x),θ(x),ϕ(x)](3)
其中,r是像素点距离原点的距离(即∣∣I−A∣∣),θ和ϕ分别代表经度和维度。该坐标系如图3所示。

图3 球系坐标系
在图3中,每一个球面上的三角形表示一个无雾图像的聚类,球心为大气光。每一个三角形到球心都是一条雾线。在同一条雾线上的像素点,仅仅只是r(x)的不同。
3.2 Estimating Initial Transmission
对于一条由J和A定义的雾线,r(x)与物体的深度有关:
r(x)=t(x)∣∣J(x)−A∣∣,0≤t(x)≤1.(4)
∣∣J(x)−A∣∣代表的是J(x)和A的距离,即由这两个点构成的雾线的长度。由于雾的存在,I(x)被“推向”大气光A,而“推向距离”与t(x)有关。
当t=1时,最大半径坐标为:
rmax=def∣∣J−A∣∣(5)
结合(4)(5),可以得到传输率:
t(x)=rmaxr(x)(6)
由于J是未知量,所以没办法通过(5)来求rmax。作者提出了一个假设,即一条雾线中,离大气光最远的像素点为无雾的像素点(该假设不一定总是成立,例如天空区域像素点的聚类。后面有处理不成立情况下的方法)。所以定义r^max为:
r^max(x)=x∈Hmax{r(x)}(7)
结合(6)(7),得到:
t~(x)=r^maxr(x)(8)
3.3 Regularization
大气散射模型给出了传输率的下限(Lower Bound):
tLB(x)=1−c∈{R,G,B}min{AcIc(x)}(9)
该公式的推导过程:因为J≥0,所以有:
t(x)=A−J(x)A−I(x)≥AA−I(x)=1−AI(x)
而t(x)在上式中是一个三个通道的向量,实际上是一个数值,且目标是求t(x)的下限,于是得到了(9)的tLB(x)。
将(9)的传出率下限约束加入到(8)中,得到:
t~LB(x)=max{t~(x),tLB(x)}
最小化如下目标函数,得到最终的t^(x):
x∑σ2(x)[t^(x)−t~LB(x)]2+λx∑y∈Nx∑∥I(x)−I(y)∥2[t^(x)−t^(y)]2(10)
分成两部分来分析上述目标函数:
1) 数据项
x∑σ2(x)[t^(x)−t~LB(x)]2
σ(x)为t~LB的标准差。σ(x)发挥了重要作用,由于σ(x)的限制,仅将估计值应用于假设成立的像素。当方差高时,初始估计的可靠性较低。σ(x)随着雾线中像素数的减少而增加。 当给定雾线中的半径分布较小时,雾线假设将不成立,因为没有观察到雾度不同的像素。 在这种情况下,σ(x)也增加。
将数据项写成如下形式有助于理解:
x∑σ2(x)1[t^(x)−t~LB(x)]2
以下两种情况假设不成立:1. 雾线像素点少;2. 雾线半径分布较小。在这两种情况下,t~LB(x)不成立,所以不需要t^(x)和其相接近,即不需要最小化[t^(x)−t~LB(x)]2该项。但总体还是需要最小化数据项,作者通过添加权重系数项来达到目的。在上述两种情况下,σ2(x)会增加,1/σ2(x)会减小,整体数据项也就会最小化。
2) 平滑项
λx∑y∈Nx∑∥I(x)−I(y)∥2[t^(x)−t^(y)]2
其中,Nx为x周围的像素点集合。当深度连续时,传输率应该相同,而一般相邻像素的深度是连续的,所以最小化相邻像素的传输率的差值,可以得到更平滑的传输率图。
3.4 Dehazing
经过上述的求解,已经得到了传输率以及大气光值,最后一步直接使用大气散射模型得到去雾后的图像:
J^(x)={I(x)−[1−t^(x)]A/t^(x)}(11)
3.5 中间结果
图4(a)和(b)分别为原图和去雾结果。(c)为每个像素点的r(x),(d)为每个像素点所属雾线的r^max(x)。(e)为每条雾线的r^max(x)在图中的像素点。(f)滤除了雾线中具有最大半径,但σ(x)>2的像素,因为模型假设不适用于这些雾线。 由于RGB空间与空气的距离非常短,因此上述像素位于天空中。 因此,由于噪声,根据它们的角度将它们聚类是不可靠的。 在正则化步骤中,通过数据项权重1/σ2(x)考虑到了这一事实,如(f)所示(暖色表示较高的值)。(g)是初步传输率估计图,(h)为最终传输率估计图。

图4 中间结果
4. 实验结果

图5 去雾结果
5. 总结
本文介绍了一种用于单图像去雾方法,名为Non-Local方法。 该方法基于这样的假设,即可以仅用数百种不同的颜色来表示图像。 在RGB空间中,这对应于数百个紧密的颜色簇。在有雾图像中,这些紧密的颜色簇会由于雾而发生变化,并在RGB空间中形成穿过大气光坐标的雾线。本文提出了一种有效的算法来识别这些雾度线并基于它们估计每个像素的传输率。 同时在正则化过程中考虑了估计的方差,因此只有符合模型假设的像素才有助于结果。
6. 读后感
和Meng的那篇文章一样,不知道第几次拿起这篇文章了。现在终于把这篇文章搞懂了。阅读完后发现,该方法和Meng的方法有着异曲同工之妙。一个是边界限制,一个是雾线。同样本文提出的方法,也是先求出一个粗糙的传输率图,再通过优化目标函数,得到最终的精细的传输率图。