自从何凯明提出导向滤波后,因为其算法的简单性和有效性,该算法得到了广泛的应用,以至于新版的matlab都将其作为标准自带的函数之一了,利用他可以解决的所有的保边滤波器的能解决的问题,比如细节增强、HDR压缩、细节羽化、去雾、风格化,而且由于其保边特性,如果很多传统函数中使用高斯滤波或者均值滤波的地方用他代替,能很好解决一些强边缘的过渡不自然问题,比如retinex、Highlight/shadow等应用中,因此,快速的实现该算法具有很强的适用意义。
本文简要的记录了本人在优化导向滤波实现的过程中所适用的优化方式和一些细节,以免时间久了后自己都不记得了,但是请不要向我直接索取源代码。
自认为目前我优化的速度在CPU版本中很难有人能超越了(仅仅使用CPU、不用多线程,下采样率0.2),如果谁有更快的算法,在第三方公证的情况下,我愿意提供1000元奖励^_^。
何凯明在导向滤波一文的相关资料中提供了其matlab代码,或者用下面的流程也可以清晰的表达:

我们看到了上面的6次取mean计算的过程,也就是浮点数的boxfilter,这个东西已经是老掉牙的一个算法了,我在几年前研究过opencv内部的这个算法,并且提出了一种比opencv实现更快的方法,详见解析opencv中Box Filter的实现并提出进一步加速的方案(源码共享) 一文。不过那里的处理时针对字节数据的,其内部用到了一些整形数据的SSE优化,如果原始数据是浮点数,那反而就更为简易了,因为SSE指令生来就是为浮点数服务的。
但是即使是这样,由于6次计算以及中间的其他一些浮点运算,依然给整个算法带来了很大的运算开销和内存开销,在很多场合还是无法满足需求的,比如实时去雾等场景。在早期我的快速去雾实现中,都是先利用下采样图的导向滤波结果,然后再双线性插值放大得到大图的透射率图,虽然在视觉效果上能解决去雾算法的速度问题,但是如果是其他场景的导向滤波需求,还是会看到很多瑕疵的。
何凯明在2015又发表了一篇《Fast Guided Filter》的文章,阐述了一种很实用的更快速的导向滤波流程:

我刚刚提的在去雾中我实用的小Trick实际上就是第六步及第七步不同,我的方式可表达如下:
6: q = meana. * I + mean<
