代码:https://github.com/JiamingMai/Color-Attenuation-Prior-Dehazing
目录
1. 摘要
本文提出了一种简单但功能强大的颜色衰减先验,用于单幅输入雾图像中去雾。 在这种先验条件下,该方法创建了对雾图像的景深进行建模的线性模型,并使用监督学习方法学习模型的参数,最终可以很好地恢复深度信息。借助雾图像的深度图,可以通过大气散射模型轻松估算传输率并恢复场景辐射度,从而有效地从单幅图像中去雾。
2. 先验
2.1 颜色衰减先验
人类大脑不需要任何额外信息,就可以很轻松的分辨出一幅图像中的有雾区域。这启发了我们对各种雾图像进行大量的实验,以寻找统计规律,寻找新的单幅图像去雾先验。作者通过实验发现雾图像中像素的亮度和饱和度随着雾浓度的变化而急剧变化。
图1给出了一个自然场景的例子,展示了雾对图像中亮度和饱和度的影响。如图1(d)所示,在无雾区域,场景的饱和度很高,亮度适中,亮度和饱和度的差值接近于零。但从(c)可以看出,在薄雾的影响下,图像块的饱和度急剧下降,而场景的颜色逐渐变淡,亮度增加的同时产生了高的差值。此外,如(b)所示,在浓雾区,更难识别场景的颜色,其差异甚至比(c)更高。
根据这一观察结果,在一幅雾图像中,这三种特性(亮度、饱和度和差值)都有规律地变化。这是巧合,还是背后有根本原因?为了回答这个问题,首先回顾一下成像过程。
2.2 图像成像过程
图2展示了图像成像过程。 在无雾的条件下,场景中的元素反射来自照射源的能量(例如,直射的阳光,漫射的天光和地面反射的光),并且到达成像系统时几乎没有能量损失。 成像系统收集从场景元素反射的入射能量,并将其聚焦到图像平面上。 在不受雾霾影响的情况下,室外图像通常具有鲜艳的色彩(如图2(a))。
在有雾的天气中,情况变得更加复杂(见图2(b))。有雾天气下成像有两种机制(直接衰减和大气光)。一方面,由反射能量的减少引起的直接衰减,导致亮度的低强度。在大气散射模型中,
t
(
x
)
J
(
x
)
t(x) \boldsymbol{J}(x)
t(x)J(x)用于描述直接衰减,即图像中像素的强度将以乘法方式降低。因此,在直接衰减的影响下,亮度强度会降低。另一方面,由环境照明的散射形成的白色或灰色的大气光增强了亮度并降低了饱和度。同样也可以通过大气散射模型对此进行解释。
(
1
−
t
(
x
)
)
A
(1-t(x))\boldsymbol{A}
(1−t(x))A表示大气光的影响。从此项可以推断出白色或灰色的大气光对观测值的影响是累加的(大气散射模型中大气光的影响是加上直接衰减项的)。因此,由于大气光的作用,亮度增加而饱和度降低。由于在大多数情况下,大气光扮演着更重要的角色,因此图像中的雾区域具有高亮度和低饱和度的特征。更重要的是,雾度越大,大气光的影响就越大。
通过以上分析,能够利用亮度和饱和度之间的差异来估算雾度的浓度。在图3中,正如预期所示,显示出亮度与饱和度差异随着雾度图像中雾度的浓度而增加。
2.3 亮度与饱和度差异与雾浓度的关系
由于雾度的浓度通常随场景深度的变化而增加,因此可以假设场景的深度与雾度的浓度呈正相关,即:
d
(
x
)
∝
c
(
x
)
∝
(
v
(
x
)
−
s
(
x
)
)
d(x) \propto c(x) \propto (v(x) - s(x))
d(x)∝c(x)∝(v(x)−s(x))
其中 d d d是场景深度, c c c是雾度的浓度, v v v是场景的亮度, s s s是饱和度, ∝ \propto ∝是正相关。上式只是观察的直觉结果,不能准确地表达 d d d, v v v和 s s s之间的联系。 下面部分,将介绍更可靠表达式的方法。
3. 场景深度复原
3.1 线性模型建模
由于亮度和饱和度之间的差异可以大致表示雾度的浓度,作者创建一个线性模型,即更精确的表达式,如下所示:
d
(
x
)
=
θ
0
+
θ
1
v
(
x
)
+
θ
2
s
(
x
)
+
ε
(
x
)
(1)
d(x) = \theta_0 + \theta_1 v(x) + \theta_2 s(x) + \varepsilon(x) \tag{1}
d(x)=θ0+θ1v(x)+θ2s(x)+ε(x)(1)
其中,
x
x
x是像素坐标,
d
d
d是场景深度,
v
v
v是雾图的亮度分量,
s
s
s是饱和度分量,
θ
0
θ_0
θ0,
θ
1
θ_1
θ1,
θ
2
θ_2
θ2是未知线性系数,
ε
(
x
)
\varepsilon(x)
ε(x)为代表模型随机误差的随机变量,可以将
ε
(
x
)
\varepsilon(x)
ε(x)视为随机图像。
ε
\varepsilon
ε是均值为
0
0
0,方差为
σ
2
\sigma^2
σ2(即
ε
(
x
)
∼
N
(
0
,
σ
2
)
\varepsilon(x) \thicksim N(0, \sigma^2)
ε(x)∼N(0,σ2))的高斯分布。根据高斯分布的性质,得到:
d
(
x
)
∼
p
(
d
(
x
)
∣
x
,
θ
0
,
θ
1
,
θ
2
,
σ
2
)
=
N
(
θ
0
+
θ
1
v
+
θ
2
s
,
σ
2
)
(2)
d(x) \thicksim p(d(x)|x,\theta_0,\theta_1,\theta_2,\sigma^2) = N(\theta_0 + \theta_1v + \theta_2s, \sigma^2) \tag{2}
d(x)∼p(d(x)∣x,θ0,θ1,θ2,σ2)=N(θ0+θ1v+θ2s,σ2)(2)
ε ( x ) \varepsilon(x) ε(x)服从均值为0,方差为 σ 2 \sigma^2 σ2的高斯分布。根据均值和方差的性质,所有随机变量加上统一的数值,不会影响其方差,只会影响均值。所以 d ( x ) = θ 0 + θ 1 v ( x ) + θ 2 s ( x ) + ε ( x ) ∼ N ( θ 0 + θ 1 v + θ 2 s , σ 2 ) d(x) = \theta_0 + \theta_1 v(x) + \theta_2 s(x) + \varepsilon(x) \thicksim N(\theta_0 + \theta_1v + \theta_2s, \sigma^2) d(x)=θ0+θ1v(x)+θ2s(x)+ε(x)∼N(θ0+θ1v+θ2s,σ2)。
3.2 训练数据收集
为了准确地学习系数
θ
0
θ_0
θ0,
θ
1
θ_1
θ1和
θ
2
θ_2
θ2,必须收集训练数据。作者从Google Images和Flickr收集了无雾图像,并使用它们生成了合成的深度图和相应的雾度图像,以获得足够的训练样本。 生成训练样本的过程如图4所示。首先,对于每个无雾图像,生成具有相同大小的随机深度图。 合成深度图中的像素值是根据开区间
(
0
,
1
)
(0, 1)
(0,1)上的标准均匀分布得出的。其次,生成随机的大气光
A
(
k
,
k
,
k
)
\boldsymbol{A}(k, k, k)
A(k,k,k),其中
k
k
k的值在
0.85
0.85
0.85和
1.0
1.0
1.0之间。 最后,由大气散射模型生成具有随机深度图
d
d
d和随机大气光
A
\boldsymbol{A}
A的模糊图像
I
\boldsymbol{I}
I。 本文使用500个无雾图像生成训练样本(500个随机深度图和500个合成雾图像)。
3.3 训练策略
将
(
2
)
(2)
(2)中的条件分布应用于整幅图像,得到联合条件分布:
L
=
p
(
d
(
x
1
)
,
.
.
.
,
d
(
x
n
)
∣
x
1
,
.
.
.
,
x
n
,
θ
0
,
θ
1
,
θ
2
,
σ
2
)
(3)
L = p(d(x_1), ..., d(x_n) | x_1, ..., x_n, \theta_0, \theta_1, \theta_2, \sigma^2) \tag{3}
L=p(d(x1),...,d(xn)∣x1,...,xn,θ0,θ1,θ2,σ2)(3)
其中, n n n是图像的像素点个数, d ( x n ) d(x_n) d(xn)为第 n n n个点的深度, L L L为似然。
可以这么理解,在 ( x 1 , . . . , x n ) (x_1, ..., x_n) (x1,...,xn)对应的 ( d ( x 1 ) , . . . , d ( x n ) ) (d(x_1), ..., d(x_n)) (d(x1),...,d(xn))都已知的情况下,,通过最大化概率 p ( d ( x 1 ) , . . . , d ( x n ) ) p(d(x_1), ..., d(x_n)) p(d(x1),...,d(xn)),求得最优的 θ 0 , θ 1 , θ 2 \theta_0, \theta_1, \theta_2 θ0,θ1,θ2。
假设每个像素点的随机误差是独立的(即
p
(
ε
1
,
.
.
.
,
ε
n
)
=
∏
i
=
1
,
.
.
.
,
n
p
(
ε
i
)
p(\varepsilon_1, ..., \varepsilon_n) = \prod_{i=1,...,n}p(\varepsilon_i)
p(ε1,...,εn)=∏i=1,...,np(εi)),可将
(
3
)
(3)
(3)重写如下:
L
=
∏
i
=
1
n
p
(
d
(
x
i
)
∣
x
i
,
θ
0
,
θ
1
,
θ
2
,
σ
2
)
(4)
L = \prod\limits_{i=1}^{n} p(d(x_i)|x_i, \theta_0, \theta_1, \theta_2, \sigma^2) \tag{4}
L=i=1∏np(d(xi)∣xi,θ0,θ1,θ2,σ2)(4)
由
(
2
)
(
4
)
(2)(4)
(2)(4)以及高斯分布的概率密度函数可以得到:
L
=
∏
i
=
1
n
1
2
π
σ
2
e
−
(
d
g
i
−
(
θ
0
+
θ
1
v
(
x
i
)
+
θ
2
s
(
x
i
)
)
)
2
2
σ
2
(5)
L = \prod\limits_{i=1}^{n} \frac{1}{\sqrt{2\pi\sigma^2}} e ^{-\frac{(dg_i-(\theta_0+\theta_1v(x_i)+\theta_2s(x_i)))^2}{2\sigma^2}} \tag{5}
L=i=1∏n2πσ21e−2σ2(dgi−(θ0+θ1v(xi)+θ2s(xi)))2(5)
其中,
d
g
i
dg_i
dgi是场景的真实深度(即3.2中生成的深度)。
文章中公式 ( 13 ) ( 14 ) ( 15 ) (13)(14)(15) (13)(14)(15)都是错误的,但是 ( 16 ) (16) (16)开始又将错误纠正了。
问题在于找到
θ
0
θ_0
θ0,
θ
1
θ_1
θ1,
θ
2
θ_2
θ2和
σ
\sigma
σ的最优值从而最大化
L
L
L。为方便计算,最大化似然的自然对数
ln
L
\ln{L}
lnL,而不是直接最大化似然。问题转化为:
arg max
θ
0
,
θ
1
,
θ
2
,
σ
ln
L
=
∑
i
=
1
n
ln
(
1
2
π
σ
2
e
−
(
d
g
i
−
(
θ
0
+
θ
1
v
(
x
i
)
+
θ
2
s
(
x
i
)
)
)
2
2
σ
2
)
(6)
\underset{\theta_0, \theta_1, \theta_2, \sigma}{\argmax} \ln L = \sum\limits_{i=1}^{n}\ln(\frac{1}{\sqrt{2\pi\sigma^2}} e ^{-\frac{(dg_i-(\theta_0+\theta_1v(x_i)+\theta_2s(x_i)))^2}{2\sigma^2}}) \tag{6}
θ0,θ1,θ2,σargmaxlnL=i=1∑nln(2πσ21e−2σ2(dgi−(θ0+θ1v(xi)+θ2s(xi)))2)(6)
首先,计算
ln
L
\ln L
lnL对
σ
\sigma
σ的偏导数,并令其等于
0
0
0:
∂
ln
L
∂
σ
=
−
n
σ
+
1
σ
3
∑
i
=
1
n
(
d
g
i
−
(
θ
0
+
θ
1
v
(
x
i
)
+
θ
2
s
(
x
i
)
)
)
2
(7)
\frac{\partial \ln L}{\partial \sigma} = -\frac{n}{\sigma} + \frac{1}{\sigma^3} \sum\limits_{i=1}^{n}(dg_i - (\theta_0 + \theta_1v(x_i) + \theta_2s(x_i)))^2 \tag{7}
∂σ∂lnL=−σn+σ31i=1∑n(dgi−(θ0+θ1v(xi)+θ2s(xi)))2(7)
( 7 ) (7) (7)的推导过程,其他同理。
令
(
7
)
=
0
(7) = 0
(7)=0,得到:
σ
2
=
1
n
∑
i
=
1
n
(
d
g
i
−
(
θ
0
+
θ
1
v
(
x
i
)
+
θ
2
s
(
x
i
)
)
)
2
(8)
\sigma^2 = \frac{1}{n} \sum\limits_{i=1}^{n}(dg_i - (\theta_0 + \theta_1v(x_i) + \theta_2s(x_i)))^2 \tag{8}
σ2=n1i=1∑n(dgi−(θ0+θ1v(xi)+θ2s(xi)))2(8)
至于线性系数
θ
0
θ_0
θ0,
θ
1
θ_1
θ1和
θ
2
θ_2
θ2,使用梯度下降算法来估计它们的值。通过求
ln
L
\ln L
lnL关于
θ
0
θ_0
θ0,
θ
1
θ_1
θ1和
θ
2
θ_2
θ2的偏导数,得到:
∂
ln
L
∂
θ
0
=
1
σ
2
∑
i
=
1
n
(
d
g
i
−
(
θ
0
+
θ
1
v
(
x
i
)
+
θ
2
s
(
x
i
)
)
)
(9)
\frac{\partial \ln L}{\partial \theta_0} = \frac{1}{\sigma^2} \sum\limits_{i=1}^{n}(dg_i - (\theta_0 + \theta_1v(x_i) + \theta_2s(x_i))) \tag{9}
∂θ0∂lnL=σ21i=1∑n(dgi−(θ0+θ1v(xi)+θ2s(xi)))(9)
∂ ln L ∂ θ 1 = 1 σ 2 ∑ i = 1 n v ( x i ) ( d g i − ( θ 0 + θ 1 v ( x i ) + θ 2 s ( x i ) ) ) (10) \frac{\partial \ln L}{\partial \theta_1} = \frac{1}{\sigma^2} \sum\limits_{i=1}^{n}v(x_i)(dg_i - (\theta_0 + \theta_1v(x_i) + \theta_2s(x_i))) \tag{10} ∂θ1∂lnL=σ21i=1∑nv(xi)(dgi−(θ0+θ1v(xi)+θ2s(xi)))(10)
∂ ln L ∂ θ 2 = 1 σ 2 ∑ i = 1 n s ( x i ) ( d g i − ( θ 0 + θ 1 v ( x i ) + θ 2 s ( x i ) ) ) (11) \frac{\partial \ln L}{\partial \theta_2} = \frac{1}{\sigma^2} \sum\limits_{i=1}^{n}s(x_i)(dg_i - (\theta_0 + \theta_1v(x_i) + \theta_2s(x_i))) \tag{11} ∂θ2∂lnL=σ21i=1∑ns(xi)(dgi−(θ0+θ1v(xi)+θ2s(xi)))(11)
然后用下列式子更新参数:
θ
i
:
=
θ
i
+
∂
ln
L
∂
θ
i
,
i
∈
{
0
,
1
,
2
}
(12)
\theta_i := \theta_i + \frac{\partial \ln L}{\partial \theta_i}, i \in \{0, 1, 2\} \tag{12}
θi:=θi+∂θi∂lnL,i∈{0,1,2}(12)
下图展示了线性系数
θ
0
θ_0
θ0,
θ
1
θ_1
θ1,
θ
2
θ_2
θ2和变量
σ
\sigma
σ的学习过程。
最终的训练结果如下:
θ
0
=
0.121779
\boldsymbol{\theta_0 = 0.121779}
θ0=0.121779,
θ
1
=
0.959710
\boldsymbol{\theta_1 = 0.959710}
θ1=0.959710,
θ
2
=
−
0.780245
\boldsymbol{\theta_2 = -0.780245}
θ2=−0.780245,
σ
=
0.041337
\boldsymbol{\sigma = 0.041337}
σ=0.041337。
3.4 景深图的估计及优化
由于已经建立了景深
d
d
d,亮度
v
v
v和饱和度
s
s
s之间的关系并估计了系数,可以根据
(
1
)
(1)
(1)恢复给定输入雾图的深度图。
但是,此模型在某些特定情况下可能无法正常工作。 例如,图像中的白色物体通常具有较高的亮度值和较低的饱和度值。 因此,提出的模型倾向于将白色的场景对象视为远景对象。 不幸的是,这种错误分类在某些情况下会导致深度估计不准确。 如图5所示,第一幅图像中的白鹅是模型难以处理的区域,图5(b)将白鹅区域估计成异常高的值。
为了解决这个问题,需要考虑邻域中的每个像素。基于场景深度局部恒定的假设,通过以下方式处理原始深度图:
d
r
(
x
)
=
min
y
∈
Ω
r
(
x
)
d
(
y
)
(13)
d_r(x) = \min\limits_{y \in \Omega_r(x)} d(y) \tag{13}
dr(x)=y∈Ωr(x)mind(y)(13)
其中,
Ω
r
(
x
)
\Omega_r(x)
Ωr(x)是一个以
x
x
x为中心的
r
×
r
r×r
r×r邻域,
d
r
d_r
dr是标度为
r
r
r的深度图。 如图5(c)所示,新的深度图
d
15
d_{15}
d15可以很好地处理鹅的区域。 但是,很明显,图像中会出现块状伪影。
为了进一步完善深度图,使用引导滤波来平滑图像。 图5(d)显示了雾图的最终还原深度图。 可以看出,经过处理的深度图有效地处理了伪影。图6显示了一些景深图估计的例子。
4. 去雾
4.1 大气光值估计
选择估计深度图中最亮的 0.1 % 0.1% 0.1%像素,并在这些最亮像素中选择对应的模糊图像 I \boldsymbol{I} I中强度最高的像素作为大气光 A \boldsymbol{A} A。
4.2 大气散射模型
有了景深图和大气光值,利用大气散射模型,便可得到无雾图。计算公式如下:
J
(
x
)
=
I
−
A
t
(
x
)
+
A
=
I
(
x
)
−
A
e
−
β
d
(
x
)
+
A
(14)
\boldsymbol{J}(x) = \frac{\boldsymbol{I} - \boldsymbol{A}}{t(x)} + \boldsymbol{A} = \frac{\boldsymbol{I}(x) - \boldsymbol{A}}{e^{-\beta d(x)}} + \boldsymbol{A} \tag{14}
J(x)=t(x)I−A+A=e−βd(x)I(x)−A+A(14)
为了避免产生过多噪声,将传输率
t
(
x
)
t(x)
t(x)的值限制在
0.1
0.1
0.1到
0.9
0.9
0.9之间。 因此,最终复原图
J
\boldsymbol{J}
J的表达式如下:
J
(
x
)
=
I
(
x
)
−
A
min
{
max
{
e
−
β
d
(
x
)
,
0.1
}
,
0.9
}
+
A
(14)
\boldsymbol{J}(x) = \frac{\boldsymbol{I}(x) - \boldsymbol{A}}{\min\{\max\{e^{-\beta d(x)}, 0.1\},0.9\}} + \boldsymbol{A} \tag{14}
J(x)=min{max{e−βd(x),0.1},0.9}I(x)−A+A(14)
在均匀区域中可以视为常数的散射系数β表示单位体积大气在所有方向上散射光的能力。 换句话说,β间接确定去雾的强度。 图7中对此进行了说明。
图7(e-g)显示了具有不同
β
\beta
β的还原传输图,图7(b-d)显示了相应的去雾结果。
可以看出,一方面,小的
β
\beta
β导致小的透射率,并且相应的结果在遥远的区域中仍然模糊不清(图7(b)和(e))。 另一方面,
β
\beta
β太大可能会导致传输率过高(图7(d)和(g))。 因此,在处理具有浓雾区域的图像时,需要适度的
β
\beta
β值。 在大多数情况下,
β
=
1.0
\beta = 1.0
β=1.0绰绰有余。因此,本文采用
β
=
1.0
\beta = 1.0
β=1.0。
5. 实验结果
5.1 真实场景主观效果
5.2 生成图像的主观效果和客观指标
1) 主观效果
2) 客观指标
6. 总结
基于模糊图像中像素的亮度和饱和度之间的差异,作者提出了一种线性颜色衰减先验。通过使用这种简单但功能强大的先验为雾图像的景深创建线性模型,并使用监督学习方法学习模型的参数,可以很好地恢复深度信息。 借助于所提出的方法获得的深度图,可以容易地恢复雾图像的真实场景。
7. 读后感
这篇文章提出的思想比较简单,但效果却不错。文章阅读起来也不难。文中提出的方法是基于监督学习的,但不是神经网络方面的。作者提出一个线性模型,通过学习得到该模型的参数,这种想法还是比较奇特的。