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

本文介绍一种基于均值滤波的快速去雾算法,适用于单幅图像处理。算法分为两部分:透射率及大气环境光的计算。通过简单快速的方法改善图像清晰度。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

基于单幅图像的快速去雾

刘倩, 陈茂银, 周东华
第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}(Hc(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)Ao t(x) \geq 1-\frac{M(x)}{A_{o}} t(x)1AoM(x)
本文通过上述的不等式求t。

首先对不等式右侧做均值滤波,记Mave(x)=average⁡sa(M(x))M_{a v e}(x)=\operatorname{average}_{s_{a}}(M(x))Mave(x)=averagesa(M(x)),则有:
1≥t(x)≥1−Mave(x)Ao 1 \geq t(x) \geq 1-\frac{M_{a v e}(x)}{A_{o}} 1t(x)1AoMave(x)
得出透射率的粗略估计:
t~(x)=1−Mave(x)Ao+φMave(x)Ao \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≤φ≤10 \leq \varphi \leq 10φ1,记δ=1−φ\delta=1-\varphiδ=1φ。则有
t~(x)=1−δMave(x)Ao \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)的均值(记作mavm_{av}mav)来表达原图的明暗程度(一般想来是可以利用灰度图的分布的,但这里作者为了简单快速起见,直接用了原图的最小通道图的均值滤波图的平均值来衡量图像的明暗,这也没有太大问题),于是有
δ~=ρmav \tilde{\delta}=\rho m_{a v} δ~=ρmav
0≤ρ≤1/mav0 \leq \rho \leq 1 / m_{a v}0ρ1/mav,在这里为了防止δ\deltaδ太大,导致t太小,从而导致结果太暗,设置了一个最小阈值0.9(该参数为论文提出且固定)。则有:
δ=min⁡(ρmav,0.9) \delta=\min \left(\rho m_{a v}, 0.9\right) δ=min(ρmav,0.9)
相应的:
t(x)=max⁡(1−min⁡(ρmav,0.9)Mave(x)Ao,1−M(x)Ao) 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)Aot(x) \geq 1-\frac{M(x)}{A_{o}}t(x)1AoM(x)对该不等式右侧做均值滤波,其实还是会影响t的,因为这里不是两侧同时均值。这会导致真实的t的部分像素点的最小值提高了!

2.求大气环境光A

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

得:Ao≥max⁡(Mave(x))A_{o} \geq \max \left(M_{a v e}(x)\right)Aomax(Mave(x)),又根据先验:Ao≤max⁡(max⁡c∈{r,g,b}(Hc(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)))这个先验条件不严谨,没有指明出处,文中也没有证明,算是个比较重大得问题),故可得:
Ao=εmax⁡(max⁡c∈r,g,b}(Hc(x)))+(1−ε)max⁡(Mave(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=12(max⁡(max⁡c∈{r,g,b}(Hc(x)))+max⁡(Mave(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,所以文中步骤为:
在这里插入图片描述

代码:

% 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);

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

在这里插入图片描述
在这里插入图片描述

在这里插入图片描述
在这里插入图片描述
当然也有些结果较差:
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值