前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >引导图滤波(Guided Image Filtering)原理以及OpenCV实现

引导图滤波(Guided Image Filtering)原理以及OpenCV实现

作者头像
一棹烟波
发布2018-03-19 17:30:28
3.4K0
发布2018-03-19 17:30:28
举报
文章被收录于专栏:一棹烟波一棹烟波

引导图滤波器是一种自适应权重滤波器,能够在平滑图像的同时起到保持边界的作用,具体公式推导请查阅原文献《Guided Image Filtering》以及matlab源码:http://kaiminghe.com/eccv10/index.html。这里只说一下自适应权重原理、C++实现灰度图像以及彩色图像的引导图滤波、验证结果。

  • 自适应权重原理 引导图滤波作为一种线性滤波器,可以简单定义为如下形式:

其中I是引导图像(guided Image),P是输入的待滤波图像,Q是滤波后的输出图像,W是根据引导图I确定的权重值。权重值W可以用下式表示(原文献有详细推导):

        μk是窗口内像素点的均值,Ii和Ij指相邻两个像素点的值,σk代表窗口内像素点的方差,ε是一个惩罚值。自适应权重可以根据上式分析得到:Ii和Ij在边界两侧时,(Ii-μk)和(Ij-μk)异号,否则,则同号。而异号时的权重值将远远小于同号时的权重值,这样处于平坦区域的像素则会被加以较大的权重,平滑效果效果更明显,而处于边界两侧的像素则会被加以较小的权重,平滑效果较弱,能够起到保持边界的效果。       惩罚值ε对滤波效果影响也很大,当ε值很小时,滤波如前面所述;当ε值很大时,权重的计算公式将近似为一个均值滤波器,平滑效果会更明显。

同样也可以根据线性滤波公式来看引导图滤波的自适应权重原理,局部线性滤波模型公式如下:

      I指引导图像,Q是输出图像,ak和bk两个系数根据引导图I和输入图像P共同决定。将上式两边求梯度,可以得到▽q=a*▽I,即输出图像的梯度信息完全由引导图像的梯度信息决定,当引导图中有边界时,输出图像中对应位置也会有边界。而a和b的值将会决定梯度信息和平滑信息的权重大小。       通过观察a和b的公式,a的分子为I和P的协方差,分母部分为I的方差加上截断值ε;b的值为P的均值减去a乘以I的均值。可以看出当a值很小时,b约等于窗口内像素点的均值pk,近似于均值滤波;而当a值很大时,输出则主要取决于a*▽I的大小,梯度信息能够得到保留。

  • C++实现灰度图像以及彩色图像的引导图滤波 根据原文献中提供的伪代码,不难用C++实现引导图滤波算法。伪代码如下:

这里需要分两种情况,1.引导图为单通道的灰度图;2.引导图为三通道的彩色图。

  1. 引导图为单通道 分别算出I与P的均值图像,以及I²和I*P的均值图像;再求出I的方差图像,以及I*P的协方差图像;利用公式求出a和b的值;再窗口内对a和b求均值;再根据公式算出输出图像。 这里又分为两种情况: ①输入图为单通道:按照上述步骤计算即可。 ②输入图为三通道:先分离三个通道,对每个通道进行上述滤波操作,然后合并通道即可。
  2. 引导图为三通道 此时,将上述模型做了稍微修改,如下:

不同之处在于求a时将原来的方差σ替换为协方差3x3矩阵∑k,表示如下:

U是3x3单位矩阵,求出来的a将不再是一个值,而是一个1*3的向量,然后求b。a为1*3的向量,μk为3*1的向量,相乘后b为一常量,由此可以求得常量b的值。 这里又分为两种情况: ①输入图为单通道:按照上述步骤计算即可。 ②输入图为三通道:先分离三个通道,对每个通道进行上述滤波操作,然后合并通道即可。 注:引导图为彩色图比引导图为灰度图,边界保护更加明显,见原文。

  • 效果验证

代码里面求均值部分,可以由OpenCV中的boxFilter()函数实现,或者blur()函数实现。总之是一个均值滤波器,之所以与窗口大小无关,是因为使用直方图实现的均值滤波,能够大大降低运算时间。VS2015+OpenCV3.4.0实现的代码放在我的码云code上:https://gitee.com/rxdj/guidedFilter.git。       主要输入参数就是引导图I,输入图P,窗口半径r,截断值ε,输出参数为滤波后图像Q。引导图I和输入图像P可以相同,也可以不同,比如stereo matching中常常用原参考图像作为引导图,对代价空间图进行引导图滤波以实现代价聚合。这样能尽量保留原图像边界区域的匹配代价,而平滑平坦区域的匹配代价。  (注:文献中的代码是通过matlab编写的,matlab中读取图像时会自动将图像归一化到0-1,因此截断值ε的设置也对应小很多,比如0.1,0.01等。而本文中读取图像后未进行归一化操作,所以截断值ε的设置会有不同。如果需要归一化,则自行读取图像后除以255即可)。

  1. 单通道灰度图原图

改变截断值ε   r=10, ε=0                            r=10,  ε=100            

r=10 , ε=2000                          r=10, ε=8000 

改变窗口半径r  r=0, ε=500                                   r=5, ε=500 

               r=10, ε=500                              r=20, ε=500 

  1. 三通道彩色图 原图

改变截断值ε   r=10, ε=0                            r=10,  ε=100                           

r=10 , ε=2000                          r=10, ε=8000 

改变窗口半径r r=0, ε=500                             r=5, ε=500                            

r=10, ε=500                              r=20, ε=500 


快速引导图滤波算法 快速引导图滤波算法见文献《fast guided filter》,上述主页中也有。快速的地方主要是采用了图像金字塔思想。步骤如下:

  1. 对引导图像I和输入图像P进行1/s的降采样,得到I', P';
  2. 利用I'和P'计算系数a和b,并计算输出图像Q';
  3. 将Q'进行s倍的上采样得到最终输出图像Q。

       由于计算部分是降采样的图像,运算量会大大减小,而不会引入明显的失真,因此成为快速引导图滤波。代码见上述码云code链接的fastGuidedFilter分支。

本文参与 腾讯云自媒体分享计划,分享自作者个人站点/博客。
如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 作者个人站点/博客 前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体分享计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档