论文阅读:A Fast Single Image Haze Removal Algorithm Using Color Attenuation Prior

论文题目及作者
代码:https://github.com/JiamingMai/Color-Attenuation-Prior-Dehazing

1. 摘要

    本文提出了一种简单但功能强大的颜色衰减先验,用于单幅输入雾图像中去雾。 在这种先验条件下,该方法创建了对雾图像的景深进行建模的线性模型,并使用监督学习方法学习模型的参数,最终可以很好地恢复深度信息。借助雾图像的深度图,可以通过大气散射模型轻松估算传输率并恢复场景辐射度,从而有效地从单幅图像中去雾。

2. 先验

2.1 颜色衰减先验

    人类大脑不需要任何额外信息,就可以很轻松的分辨出一幅图像中的有雾区域。这启发了我们对各种雾图像进行大量的实验,以寻找统计规律,寻找新的单幅图像去雾先验。作者通过实验发现雾图像中像素的亮度和饱和度随着雾浓度的变化而急剧变化。
雾对图像中亮度和饱和度的影响

图1 雾对图像中亮度和饱和度的影响

    图1给出了一个自然场景的例子,展示了雾对图像中亮度和饱和度的影响。如图1(d)所示,在无雾区域,场景的饱和度很高,亮度适中,亮度和饱和度的差值接近于零。但从(c)可以看出,在薄雾的影响下,图像块的饱和度急剧下降,而场景的颜色逐渐变淡,亮度增加的同时产生了高的差值。此外,如(b)所示,在浓雾区,更难识别场景的颜色,其差异甚至比(c)更高。
    根据这一观察结果,在一幅雾图像中,这三种特性(亮度、饱和度和差值)都有规律地变化。这是巧合,还是背后有根本原因?为了回答这个问题,首先回顾一下成像过程。

2.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} (1t(x))A表示大气光的影响。从此项可以推断出白色或灰色的大气光对观测值的影响是累加的(大气散射模型中大气光的影响是加上直接衰减项的)。因此,由于大气光的作用,亮度增加而饱和度降低。由于在大多数情况下,大气光扮演着更重要的角色,因此图像中的雾区域具有高亮度和低饱和度的特征。更重要的是,雾度越大,大气光的影响就越大。
    通过以上分析,能够利用亮度和饱和度之间的差异来估算雾度的浓度。在图3中,正如预期所示,显示出亮度与饱和度差异随着雾度图像中雾度的浓度而增加。
亮度与饱和度差异与雾浓度的关系

图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个合成雾图像)。
训练数据生成过程

图4 训练数据生成过程

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=1np(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=1n2πσ2 1e2σ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=1nln(2πσ2 1e2σ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=1n(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=1n(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} θ0lnL=σ21i=1n(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} θ1lnL=σ21i=1nv(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} θ2lnL=σ21i=1ns(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+θilnL,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)将白鹅区域估计成异常高的值。
深度图的优化

图5 深度图的优化

    为了解决这个问题,需要考虑邻域中的每个像素。基于场景深度局部恒定的假设,通过以下方式处理原始深度图:
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显示了一些景深图估计的例子。
一些例子

图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)IA+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 散射系数的取值对去雾的效果影响

    图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) 客观指标

MSE
SSIM

6. 总结

    基于模糊图像中像素的亮度和饱和度之间的差异,作者提出了一种线性颜色衰减先验。通过使用这种简单但功能强大的先验为雾图像的景深创建线性模型,并使用监督学习方法学习模型的参数,可以很好地恢复深度信息。 借助于所提出的方法获得的深度图,可以容易地恢复雾图像的真实场景。

7. 读后感

    这篇文章提出的思想比较简单,但效果却不错。文章阅读起来也不难。文中提出的方法是基于监督学习的,但不是神经网络方面的。作者提出一个线性模型,通过学习得到该模型的参数,这种想法还是比较奇特的。

在单个图像去雾算法中,使用暗通道先验方法(matlab single image haze removal using dark channel prior)是一种常用的方法。 该方法利用了图像中的暗像素值数据来对图像中的雾进行估计和消除。在图像中,由于雾的存在,远处的物体会有较高的亮度减弱,而靠近观察点的物体则有较高的亮度增强。由于光照强度不均匀,较暗的像素通常代表空气中的雾浓度较低,而较亮的像素通常代表雾浓度较高。 暗通道先验方法的基本思想是,通过查找图像中的暗像素值,可以估计出该区域中的最小远景透射率。透射率是雾的浓度与雾气对光的散射强度之间的比例关系。通过估计最小透射率,可以推断出雾浓度的分布,从而进行雾的去除。这个估计过程可以通过计算图像每个像素点的一个小窗口内的最小像素值来实现。 具体的暗通道先验算法包括以下步骤: 1. 对输入的雾图像进行预处理,包括图像的亮度归一化和颜色空间转换。 2. 计算每个像素点对应的暗通道,即选择一个固定大小的窗口,在窗口内找到最小像素值。 3. 估计最小透射率,最常用的方法是使用暗像素值和其相应的原始像素值计算得到。 4. 通过估计的透射率和原始图像进行重建,可以得到去雾后的图像。 暗通道先验方法是一种简单但有效的去雾算法,可以在图像中消除大部分的雾效果,提高图像的清晰度和可见度。
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值