【论文阅读】基于单幅图像的快速去雾

基于单幅图像的快速去雾

刘倩, 陈茂银, 周东华
第25届中国控制与决策会议论文集. 2013.

本文提出了一种基于均值滤波的去雾算法,算是后续多种基于均值滤波去雾算法的鼻祖。虽然本文于2013提出,当时何凯明的暗通道去雾算法已经非常有名,但是本文算法以其简单、快速、实际去雾效果好的特点,引起广大研究者的关注,本文也算是去雾论文里比较出名的中文论文。

本文将从两个方面介绍该论文。主要是A的求法、T的求法两部分,关于大气散射模型不再赘述,默认各位读者有去雾算法的研究基础(若是没有该基础,建议先仔细研读何凯明于CVPR2009发表的《Single Image Haze Removal Using Dark Channel Prior》)。

1.求投射率。

根据大气散射模型:
H ( x ) = F ( x ) t ( x ) + A ( 1 − t ( x ) ) H(x)=F(x) t(x)+A(1-t(x)) H(x)=F(x)t(x)+A(1t(x))
由于上式中H、F、A、t均是大于0的,所以有:
A ( 1 − t ( x ) ) ≤ H ( x ) A(1-t(x)) \leq H(x) A(1t(x))H(x)
这里通常假设A全局常量,则对左右取最小值,且记 M ( x ) = min ⁡ c ∈ { r , g , b } ( H c ( x ) ) M(x)=\min _{c \in\{r, g, b\}}\left(H^{c}(x)\right) M(x)=minc{r,g,b}(Hc(x))。得:
t ( x ) ≥ 1 − M ( x ) A o t(x) \geq 1-\frac{M(x)}{A_{o}} t(x)1AoM(x)
本文通过上述的不等式求t。

首先对不等式右侧做均值滤波,记 M a v e ( x ) = average ⁡ s a ( M ( x ) ) M_{a v e}(x)=\operatorname{average}_{s_{a}}(M(x)) Mave(x)=averagesa(M(x)),则有:
1 ≥ t ( x ) ≥ 1 − M a v e ( x ) A o 1 \geq t(x) \geq 1-\frac{M_{a v e}(x)}{A_{o}} 1t(x)1AoMave(x)
得出透射率的粗略估计:
t ~ ( x ) = 1 − M a v e ( x ) A o + φ M a v e ( x ) A o \tilde{t}(x)=1-\frac{M_{a v e}(x)}{A_{o}}+\varphi \frac{M_{a v e}(x)}{A_{o}} t~(x)=1AoMave(x)+φAoMave(x)
其中右侧最末尾的是增补项。显然 0 ≤ φ ≤ 1 0 \leq \varphi \leq 1 0φ1,记 δ = 1 − φ \delta=1-\varphi δ=1φ。则有
t ~ ( x ) = 1 − δ M a v e ( x ) A o \tilde{t}(x)=1-\delta \frac{M_{a v e}(x)}{A_{o}} t~(x)=1δAoMave(x)
这里可以看到,T由原图的均值图像Mave和A同时决定,而 δ \delta δ起到整体调节明暗变化。根据以往的先验(如DCP),从这点来说这里是有问题的。因为固定A和 δ \delta δ那么认为传输图与原图的最小通道图的均值图像成反相关(这应该算是本文依赖的先验,然而该先验是没有证明的,也没有相关统计支撑)!

继续往下走,为了让 δ \delta δ能够根据图像内容动态调节去雾后的图像的明暗程度,作者将 δ \delta δ设置为一个与原图明暗程度相关的参数,这里用上文中的 M ( x ) M(x) M(x)的均值(记作 m a v m_{av} mav)来表达原图的明暗程度(一般想来是可以利用灰度图的分布的,但这里作者为了简单快速起见,直接用了原图的最小通道图的均值滤波图的平均值来衡量图像的明暗,这也没有太大问题),于是有
δ ~ = ρ m a v \tilde{\delta}=\rho m_{a v} δ~=ρmav
0 ≤ ρ ≤ 1 / m a v 0 \leq \rho \leq 1 / m_{a v} 0ρ1/mav,在这里为了防止 δ \delta δ太大,导致t太小,从而导致结果太暗,设置了一个最小阈值0.9(该参数为论文提出且固定)。则有:
δ = min ⁡ ( ρ m a v , 0.9 ) \delta=\min \left(\rho m_{a v}, 0.9\right) δ=min(ρmav,0.9)
相应的:
t ( x ) = max ⁡ ( 1 − min ⁡ ( ρ m a v , 0.9 ) M a v e ( x ) A o , 1 − M ( x ) A o ) t(x)=\max \left(1-\min \left(\rho m_{a v}, 0.9\right) \frac{M_{a v e}(x)}{A_{o}}, 1-\frac{M(x)}{A_{o}}\right) t(x)=max(1min(ρmav,0.9)AoMave(x),1AoM(x))
这里也比较好理解,因为最开始公式是大于等于的,所以设立一个最小值理所当然,故这里取了max。

原文还提出了一个t的变形L,其实没有多大意义,就其原理就是上面的过程。

但是这里不得不说,上面的推导其实还是有点问题的,整个求t的最开始 t ( x ) ≥ 1 − M ( x ) A o t(x) \geq 1-\frac{M(x)}{A_{o}} t(x)1AoM(x)对该不等式右侧做均值滤波,其实还是会影响t的,因为这里不是两侧同时均值。这会导致真实的t的部分像素点的最小值提高了!

2.求大气环境光A

从下式出发:
1 ≥ t ( x ) ≥ 1 − M a v e ( x ) A o 1 \geq t(x) \geq 1-\frac{M_{a v e}(x)}{A_{o}} 1t(x)1AoMave(x)

得: A o ≥ max ⁡ ( M a v e ( x ) ) A_{o} \geq \max \left(M_{a v e}(x)\right) Aomax(Mave(x)),又根据先验: A o ≤ max ⁡ ( max ⁡ c ∈ { r , g , b } ( H c ( x ) ) ) A_{o} \leq \max \left(\max _{c \in\{r, g, b\}}\left(H^{c}(x)\right)\right) Aomax(maxc{r,g,b}(Hc(x)))这个先验条件不严谨,没有指明出处,文中也没有证明,算是个比较重大得问题),故可得:
A o = ε max ⁡ ( max ⁡ c ∈ r , g , b } ( H c ( x ) ) ) + ( 1 − ε ) max ⁡ ( M a v e ( x ) ) A_{o}=\varepsilon \max \left(\max _{c \in r, g, b \}}\left(H^{c}(x)\right)\right)+(1-\varepsilon) \max \left(M_{a v e}(x)\right) Ao=εmax(cr,g,b}max(Hc(x)))+(1ε)max(Mave(x))
文中取参数 ε = 0.5 \varepsilon=0.5 ε=0.5,得
A = 1 2 ( max ⁡ ( max ⁡ c ∈ { r , g , b } ( H c ( x ) ) ) + max ⁡ ( M a v e ( x ) ) ) A=\frac{1}{2}\left(\max \left(\max _{c \in\{r, g, b\}}\left(H^{c}(x)\right)\right)+\max \left(M_{a v e}(x)\right)\right) A=21(max(c{r,g,b}max(Hc(x)))+max(Mave(x)))
文中A取三通道相等,显然也是比较粗糙得。

3.去雾

通过A、t,根据大气散射模型即可,由于文中引入公式变形L,所以文中步骤为:
【论文阅读】基于单幅图像的快速去雾_第1张图片

代码:

% step1: 输入:有雾图像H(x)
H = imread('img\house_input.png');
H = double(H) / 255.0;
[h, w] = size(H);
imtool(H);

% sv为图像长边除以50后的取奇结果,这里作用是动态调节滤波半径
sv = ceil(max(h, w) / 50);
if mod(sv, 2) == 0
    sv = sv + 1;
end

% step2: 求取H(x)三通道的最小值M(x),M为最小通道值取得的灰度图
M = min(H, [], 3);
imtool(M);

% step3:M(x)进行均值滤波,得到Mave(x)
% 此处f为均值模板,即以sv为滤波半径的均值滤波器
f = fspecial('average', sv);
Mave = imfilter(M, f, 'replicate');
imtool(Mave); % 由于均值滤波,所以边缘很模糊!!!!!!! !
t_coarse = Mave;

% step4: 求取M(x)中所有元素的均值Mav
Mav = mean(mean(Mave));

% step5: 利用Mave(x)求出L(x)
% e是一个用来调节的参数,当e值越大时,去雾后的图像就越暗,去雾效果就越明显,
% e值越小时,图像偏白,有明显的雾气。这里参数e可调
e = 2.0;    
L = min(min(e*Mav, 0.9)*Mave, M);% 这里的L实际就是T的变形
% t = max(1-min(e*Mav,0.9)/mean(A)*Mave,1-M/mean(A));
% L1 = mean(A)*(1-t); 

% step6: 利用Mave(x)H(x),求出A
temp = max(H, [], 3);
% 这里A取:(原图最大值+最小图的均值结果的最大值)再取平均。A值三个通道相同!!!!!!!!!!!!!
A = 0.5 * (max(temp(:)) + max(Mave(:))) * [1; 1; 1];

t_refine = 1 - L/mean(A);
imtool(t_refine);

% step7: 去雾后图像F(x)
[h, w, c] = size(H);
dehazed = zeros(h, w, c);
for i=1:h
    for j=1:w
        for k=1:c
            dehazed(i,j,k) = (H(i,j,k) - L(i,j)) / (1 - L(i,j)/A(k));
        end
    end
end
imtool(dehazed);

代码还是很简单易懂得,速度也很快,效果如下,也还不错。




当然也有些结果较差:


【论文阅读】基于单幅图像的快速去雾_第2张图片

你可能感兴趣的:(图像处理,图像去雾)