基于图像复原的去雾方法中,最有代表性的是暗通道去雾算法,但是暗通道去雾算法的处理时间比较长,不能达到实时处理。在阅读了大量文献及其参考文献,找到能够实时处理的去雾算法,是清华大学写的文章:基于单幅图像的快速去雾算法,作者:刘倩,陈茂华,周东华。
废话不多说,直接上算法
首先对算法进行一个简单的说明,根据博文去雾技术综述可知,去雾的主要步骤就是估计全局大气光
A
和透射率
文章中,使用了
L(x)
来代替
A(1−t(x))
。
L(x)=A(1−t(x))⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅(1)
因此,本文就是根据输入图像估计
A
和估计透射率 t(x)
根据博文 去雾技术综述可知,
t(x)≥1−H(x)A⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅(2)
取
H(x)
三通道中的最小值,并记为
M(x)=minc∈r,g,b(Hc(x))⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅(3)
因此公式(2)可以变换为
t(x)≥1−M(x)A⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅(4)
对公式(4)右边进行均值滤波
averagesa(1−M(x)A)=1−averagesa(M(x))A=1−∑y∈Ω(x)M(y)Asa2⋅⋅⋅⋅(5)
其中,
sa
表示均值滤波窗口大小,
Ω(x)
表示像素x的
sa×sa
的邻域。均值滤波后的结果能反应
t(x)
的大致趋势,但与真实的
t(x)
还相差一定的绝对值,于是,得出透射率的粗略估计值
t (x)=1−Mave(x)A+ψMave(x)A=1−δMave(x)A⋅⋅⋅⋅⋅⋅⋅(6)
其中
Mave(x)=averagesa(M(x))
,
δ=1−ψ
,
ψ∈[0,1]
,因此
δ∈[0,1]
。为了防止去雾后图像出现整体画面偏暗,这里根据图像的均值来调整
δ
,即
L(x)=min(min(ρmav,0.9)Mave(x),M(x))⋅⋅⋅⋅⋅⋅⋅(8)
估计全局大气光
公式(5)中第一个等式左侧的表达式取值范围应为[0, 1],由此得出 A≥max(Mave(x)) ,一般情况下又有 A≤max(maxc∈r,g,b(Hc(x))) 。这样就初步确定了全局大气光的范围,为了能够快速获取全局大气光,文章直接取两者的平均值作为全局大气光
A=12(max(H(x))+max(Mave(x)))⋅⋅⋅⋅⋅⋅⋅⋅(9)
然后根据雾天退化模型恢复出无雾图像。
因本人水平有限,如有错误,还请批评指正。
附上代码下载地址:
源码下载地址