一、绪论
图像去雾技术,是由何凯明、孙健等人在CVPR2009提出来的,并获得当年CVPR最佳论文奖[1]。它可以还原图像的颜色和能见度,同时也能利用雾的浓度来估计物体的距离,这些在计算机视觉上都有重要应用(例如三维重建,物体识别)。
二、雾霭图像模型与暗通道先验
有雾图像的描述模型为:
I ( x ) = J ( x ) ∙ t ( x ) + A ( 1 − t ( x ) ) (1) I\left( x \right)=J\left( x \right)\bullet t\left( x \right)+A\left( 1-t\left( x \right) \right) \tag{1} I(x)=J(x)∙t(x)+A(1−t(x))(1)
其中,I是实际观测的图像;J是没有雾情况下的理想场景图像,它仅与地物相关;A是大气的光亮度,图像去雾的实质是恢复从单幅图像Ⅰ恢复J和A;t是大气介质透射率,它与大气的厚度紧密相关,因而随像素的位置而变化。假设d是场景与相机之间的距离,β是大气散射系数,在大气是均匀同性的情况下,t与d存在如下关系
t ( x ) = e − β d ( x ) (2) t\left( x \right)={{e}^{-\beta d\left( x \right)}} \tag{2} t(x)=e−βd(x)(2)
同时t≤1,上式表明场景的辐射值随距离呈指数衰减。
模型右边第一项J(x)·t(x)称为直接衰减,它描述了场景的真实辐射值及其在介质中的衰减,第二项A(1-t(x)称为天空光,它来源于大气散射,并使得场景的颜色发生偏移。
何凯明等通过对无雾图像的统计,发现在无雾图像中,每一个局部区域都很有可能会有阴影,或者是纯颜色的东西,又或者是黑色的东西。因此,每一个局部区域都很有可能有至少一个颜色通道会有很低的值以至于接近于0值。这一规律叫做暗通道先验(Dark Channel prior)。直观来说,Dark Channel prior认为每一个局部区域都总有一些很暗的东西。这个规律很简单,但在去雾问题上却是本质的基本规律。对于任意图像J,Dark channel Prior通过下式描述:
J
d
a
r
k
(
k
)
=
min
y
∈
Ω
(
x
)
(
min
c
∈
{
r
,
g
,
b
}
(
J
c
(
y
)
)
)
(3)
{{J}^{dark}}(k)={{\min }_{y\in \Omega \left( x \right)}}\left( {{\min }_{\text{c}\in \{r,g,b\}}}({{J}^{c}}(y)) \right) \tag{3}
Jdark(k)=miny∈Ω(x)(minc∈{r,g,b}(Jc(y)))(3)
式中,
J
d
a
r
k
{{J}^{dark}}
Jdark表示暗通道;
J
c
{{J}^{c}}
Jc是J的颜色通道;
Ω
(
x
)
\Omega \left( x \right)
Ω(x)是以x为中心的图像块。该式包含了提取R、G、B三个通道最小值与最小值滤波处理两层计算,实验观察表明,对于绝大多数户外无雾的自然场景图像J,除去天空区域以外,
J
d
a
r
k
{{J}^{dark}}
Jdark非常低且接近于0值:
J
d
a
r
k
→
0
{{J}^{dark}}\to 0
Jdark→0。对于有雾的原始图像,可以从暗通道先验处理后的结果中估计透射图和天空亮度值A。
由于雾总是灰白色的,因此一旦图像受到雾的影响,那么这些本来应该很暗的东西就会变得灰白。不仅如此,根据雾霭的形成模型,还能根据这些东西的灰白程度来判断雾的浓度。Dark Channel Prior能很有效地去除雾的影响,同时利用物的浓度来估算物体的距离。
三、透射率估计
假设大气光亮度A已知,有雾图像模型放在每一个通道,有:
I c ( x ) = J c ( x ) ∙ t ( x ) + A c ( 1 − t ( x ) ) (4) {{I}_{c}}\left( x \right)={{J}_{c}}\left( x \right)\bullet t\left( x \right)+{{A}^{c}}\left( 1-t\left( x \right) \right) \tag{4} Ic(x)=Jc(x)∙t(x)+Ac(1−t(x))(4)
式子两边除以 A c {{A}^{c}} Ac得到
I c ( x ) A c = J c ( x ) ∙ t ( x ) A c + ( 1 − t ( x ) ) (5) \frac{{{I}_{c}}\left( x \right)}{{{A}^{c}}}=\frac{{{J}_{c}}\left( x \right)\bullet t\left( x \right)}{{{A}^{c}}}+\left( 1-t\left( x \right) \right)\tag{5} AcIc(x)=AcJc(x)∙t(x)+(1−t(x))(5)
按照式(3)提取暗通道,并假设局部区域内t近似不变:
其中,
J
c
{{J}_{c}}
Jc是无雾图像。由前面知道,对于无雾图像除去天空外,
J
d
a
r
k
→
0
{{J}^{dark}}\to 0
Jdark→0,即有
依此得到C
即透射率:
式中设置常数
ω
(
0
<
ω
<
1
)
\omega \left( 0<\omega <1 \right)
ω(0<ω<1),目的是使估计值接近于自然,这是因为即使在大气非常纯净的情况下,大气中也必然包含着水气。
如果直接利用这里估计的透射率图像,那么在恢复图像中会产生“光晕”,为此需对透射率进行优化以消除恢复图像中的光晕。本博文采用何凯明提出的 guided image filtering方法。
四、大气光值估计
对于天空区域,暗通道这一先验信息是不成立的。实际上有雾图像的天空区域像素值强度与大气光值A非常接近,因此对天空区域:
此时,t(x)→0。基于此,可以利用暗通道图像来估计大气光值,首先找出暗通道图像中最亮像素的0.1%,然后在这些像素中找出对应原图像中灰度值最高的像素作为大气光值。求出了透射率和大气光值之后就可以利用有雾图像模型来恢复图像:
式中,
t
0
{{t}_{0}}
t0是一个较小的值。
以上过程概括为图1所示的流程图进行简单的描述。
五、实例分析
以常见的自然景象为测试,根据以上原理估计图像的暗通道、大气透射率以及进行无雾图像的恢复。需要说明的是,对透射率的优化是采用guided image filtering方法,实验结果如下图示所示:
参考文献
[1] Kaiming He, Jian Sun, Xiaoou Tang. Single Image Haze Removal Using Dark Channel Prior [J]. IEEE transactions on pattern analysis and machine intelligence, 2010, 33.
本文matlab代码可从以下链接处获取:
一种基于暗通道先验算法的图像去雾技术研究(matlab代码)
博主简介:擅长智能优化算法、信号处理、图像处理、机器视觉、神经网络等领域Matlab仿真以及实验数据分析等,matlab代码问题、商业合作、课题选题与指导等均可私信交流。