http://blog.csdn.net/cfqcfqcfqcfqcfq/article/details/52857141
1、暗原色方法的缺陷
使用暗原色先验知识获取到的t估计图关键就是利用最小值滤波器求去最小值,而这个过程受到滤波核ksize的影响较大,滤波核选取的比较小时,t估计图细节较多,层次感好。但是平滑较少,局部错误增多。而滤波核ksize取值较大时,会得到分布过于单一的暗原色图,致使t估计图的细节和层次感不够明显,不能有效区分距离的远近。由于多数真实图像的雾气浓度分布不均,使得去雾效果不明显。
这些因素决定对于一些场景比较复杂的图像来说得不到较为理想的结果,例如下面的图片:
图左侧为t预估图:可以看到很多图像细节都被方格化而导致丢失。右侧为去雾效果 明显失真
2、导向滤波优化t值
查阅论文有很多改进的t值求取方法。其中导向滤波、双边滤波有较好的效果,当引导图G与输入图P为同一个图像的时候,导向图滤波的效果与双边滤波的效果类似,但是不同于双边滤波的是,导向图滤波可以很容易设计一个与滤波半径无关的优化算法。现状拟采用导向滤波来优化t值。导向滤波的理论在百度百科有很详细的介绍(导向滤波链接)。这里在简单罗列一下:
导向滤波技术是一种图像滤波技术,通过一张引导图G(导向图),对目标图像P(输入图像)进行滤波处理,使得最后的输出图像大体上与目标图像P相似,但是纹理部分与引导图G相似。
记引导图(导向图)为G,输入图像为P,输出图像为Q,导向图滤波的目标就是使得原始的输入和输出尽可能相同,同时
纹理部分与引导图G相似。
对于目标1:输入图像P和输出图像Q尽可能相似,可以用公式描述为:
对于目标2:输出图像Q的纹理和引导图G尽可能相似,用公式描述为:
上式中如果Q为单通道图像,G为多通道,那么a为一个向量;如果Q和G通道数相同,那么a为标量或者对角矩阵。显然,a的值越小,最后的输出图像也就越平滑。
对于目标2,
可以对等式两边取定积分,从而得到:
我们的目标就是求取a和b两个值,下面给出a、b值的求取公式:
导向滤波优化后的t预估图:
3、代码实现
导向图为原始图像的灰度图,这样就可以保证纹理部分与原图相似。而输入就是暗原色先验知识求的的t预估图。导向滤波的滤波核选取是一个很重要的问题,这里根据参考文献1做了选择优化 取最小值滤波核的4倍。
4、结果:
5、注意问题:
1、在对图像像素做数学运算时,要将值的类型转换为double类型,在int类型下做除法很容易丢失数据 导致结果不正确。
2、如果将图像转换为浮点类型,那么其数值范围在0-1之间才是有意义的,也就是说只有转化为0-1(归一化)才能imshow出真确的结果 参考文献
3、实际测试时 导向图使用原图的min[r,g,b]貌似比使用原图的gray效果好一些,没有大量验证,不能最终确定
更新:
本人将该算法完善后,用Qt实现了一个简单的GUI应用程序,效果如下:
源码放到github上边,下载地址如下:
只上传源码 相关联的库包未给出 可以根据readme中的介绍下载对应库包
参考文献:
1、
点击打开链接
2、
导向滤波
3、
float取值范围