原理可以参看:白马负金羁的《导向滤波(Guided Filter)的解析与实现》 ,写得很清晰透彻
我实现的效果如下
原图(894*1080,由于笔记本屏幕不够大,截图有截断)
单通道的导向滤波
1.CPU 版的 Guided Filter 和 Fast Guided Filter (缩放倍数为 2,何凯明大神加了一个 resize 就成了新算法,大神就是大神!) 的耗时(循环 100 次取平均):
2.基于 OpenCV CUDA 编译库实现的 Guided Filter (实现了多流覆盖)的耗时
可见 OpenCV 实现的 CUDA 函数其实性能也是有很大优化空间的。由于 GPU 开辟设备内存相当耗时,一般 GPU 内存是重用的(比如视频流),上图的时间是 Guided Filter 循环 100 次计算的平均值。
3. CUDA 加速的 Guided Filter 耗时:
同上,所以内存开辟的时间只记录一次,Guided Filter 是循环 100 次计算的平均值。可见设备内存开辟的时间还是很多的,所以如果只处理少量图片,GPU 并不占优势,适合采用 CPU 版的 Fast Guided Filter 。
如果引导图像和原图是同一张图的话,还可以尽一步减少计算时间,避免重复计算。