Guided Filter
常言道“温故而知新”,写此文章就是对自己目前学习内容的小小的总结与记录。
本文力求用最简洁的语言,详细的代码将此部分内容讲解清楚,但由于博主同样是刚刚接触OpenCV,或许表达上有些瑕疵,还望读者能够指教探讨,大家共同进步。
博主机器配置为:VS2013+opencv2.4.13+Win-64bit。
若本文能给读者带来一点点启示与帮助,我就很开心了。
====================分割线====================
1-引导滤波/导向滤波(Guided Filter)
引导滤波(导向滤波)是一种图像滤波技术,通过一张引导图,对初始图像p(输入图像)进行滤波处理,使得最后的输出图像大体上与初始图像P相似,但是纹理部分与引导图相似。其典型应用有两个:保边图像平滑,抠图。
引导滤波(导向滤波)的目的是,保持双边滤波的优势(有效保持边缘,非迭代计算),而克服双边滤波的缺点(设计一种时间复杂度为 O(1) 的快速滤波器,而且在主要边缘附近没有梯度的变形)。
引导滤波(导向滤波)不仅能实现双边滤波的边缘平滑,而且在检测到边缘附近有很好的表现,可应用在图像增强、HDR压缩、图像抠图及图像去雾等场景。
导向图滤波的应用1. 保边图像平滑
当引导图与输入图 p 为同一个图像的时候,导向滤波的效果与双边滤波的效果类似,但是不同于双边滤波的是,导向滤波可以很容易设计一个与滤波半径无关的优化算法。其中窗口半径为平滑半径,参数为平滑项参数,其值越大平滑的越明显。2. 抠图
当输入图p为一个初始的mask图像时,导向滤波的效果类似于抠图算法,其中窗口半径为抠图的半径,参数为平滑项。
==================分割线=============
2-引导滤波算法原理【重点部分】
引导滤波是由何凯明等人于2010年发表在ECCV的文章《Guided Image Filtering》中提出的,后续于2013年发表了改进算法快速引导滤波的实现。它与双边滤波最大的相似之处,就是同样具有保持边缘特性。在引导滤波的定义中,用到了局部线性模型,至于该模型,可以暂时用下图简单的理解:
need-to-insert-img
该模型认为,某函数上一点与其邻近部分的点成线性关系,一个复杂的函数就可以用很多局部的线性函数来表示,当需要求该函数上某一点的值时,只需计算所有包含该点的线性函数的值并做平均即可。这种模型,在表示非解析函数上,非常有用。
----------------------------------【1步】----------------------------------
同理,我们可以认为图像是一个二维函数,而且没法写出解析表达式,因此我们假设该引导滤波函数的输出与输入在一个二维窗口内满足线性关系,如下:
其中,q是输出像素的值,是输入图像的值,i和k是像素索引,a和b是当窗口中心位于k时该线性函数的系数。
其实,输入图像不一定是待滤波的图像本身,也可以是其它的图像即引导图像,这也是为何称为引导滤波的原因。
对上式两边取梯度,可以得到:
即当输入图像有梯度时,输出 q 也有类似的梯度,现在可以解释为什么引导滤波有边缘保持特性了。
这与在去雾、超分辨率、抠图等研究中使用的模型是一致的。
q 即 p去除噪声或者纹理之后的图像:
其中,表示噪声。
引导滤波的简易流程见下图:
need-to-insert-img
----------------------------------【2步】----------------------------------
下一步是求出线性函数的系数,也就是线性回归,即希望拟合函数的输出值 q与真实值 p 之间的差距最小,转化为最优化问题,也就是让下式最小:
作者:东Rain
链接:https://www.jianshu.com/p/4fce5af4dd3d
来源:简书
著作权归作者所有。商业转载请联系作者获得授权,非商业转载请注明出处。