引导图是一种自适应权重滤波器,能够在平滑图像的同时起到保持边界的作用,具体公式推导请查阅原文献《Guided Image Filtering》。这里只说一下自适应权重原理、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的值。

    这里又分为两种情况:
    ①输入图为单通道:按照上述步骤计算即可。
    ②输入图为三通道:先分离三个通道,对每个通道进行上述滤波操作,然后合并通道即可。

    注:引导图为彩色图比引导图为灰度图,边界保护更加明显,见原文。

  • 效果验证

代码里面求均值部分,可以由OpenCV中的boxFilter()函数实现,或者blur()函数实现。总之是一个均值滤波器,之所以与窗口大小无关,是因为使用直方图实现的均值滤波,能够大大降低运算时间。VS2015+OpenCV3.4.0实现的代码放在我的码云code上:https://gitee.com/rxdj/guidedFilter.git
      主要输入参数就是引导图I,输入图P,窗口半径r,截断值ε,输出参数为滤波后图像Q。引导图I和输入图像P可以相同,也可以不同,比如stereo matching中常常用原参考图像作为引导图,对代价空间图进行引导图滤波以实现代价聚合。这样能尽量保留原图像边界区域的匹配代价,而平滑平坦区域的匹配代价。

  1. 单通道灰度图
    原图


              r=10, ε=0                            r=10,  ε=100                  r=10 , ε=800                          r=10, ε=2000 
              

    r=0, ε=500                             r=5, ε=500                            r=10, ε=500                              r=20, ε=500 
              
  2. 三通道彩色图
    原图


      r=10, ε=0                            r=10,  ε=100                           r=10 , ε=800                          r=10, ε=2000 
                 

    r=0, ε=500                             r=5, ε=500                            r=10, ε=500                              r=20, ε=500 
                

引导图滤波(Guided Image Filtering)原理以及OpenCV实现的更多相关文章

  1. Guided Image Filtering

    在图像滤波中,人们最希望的就是可以将图像中的噪声过滤掉的同时,能够让边缘尽可能的保持.噪声属于高频信号,而边缘其实也是一种高频信号,所以一般的滤波器,比如高斯模糊,均值模糊,都是一种低通滤波器,能够将 ...

  2. iOS 添加功能引导图

    iOS 添加功能引导图 首次安装app之后,打开app首页,有一张功能引导图,其实最简单的一种做法是,直接在这个首页上加一个蒙层图片. 在蒙层上用气泡显示文字注明功能介绍,这个蒙层图片,让你们的UI设 ...

  3. sobel算子原理及opencv源码实现

    sobel算子原理及opencv源码实现 简要描述 sobel算子主要用于获得数字图像的一阶梯度,常见的应用和物理意义是边缘检测. 原理 算子使用两个33的矩阵(图1)算子使用两个33的矩阵(图1)去 ...

  4. Gradient Domain Guided Image Filtering(梯度域导向滤波)

    作者提出了一种新的梯度域引导图像滤波器,通过将明确的一阶边缘感知约束结合到现有的引导图像滤波器中. matlab代码实现 转载至:https://blog.csdn.net/majinlei121/a ...

  5. 一张图说明CDN网络的原理

    原文: http://blog.csdn.net/coolmeme/article/details/9468743 1.用户向浏览器输入www.web.com这个域名,浏览器第一次发现本地没有dns缓 ...

  6. Neo4j图数据库简介和底层原理

    现实中很多数据都是用图来表达的,比如社交网络中人与人的关系.地图数据.或是基因信息等等.RDBMS并不适合表达这类数据,而且由于海量数据的存在,让其显得捉襟见肘.NoSQL数据库的兴起,很好地解决了海 ...

  7. Unity Shader-法线贴图(Normal)及其原理

    简介 以前经常听说“模型不好看啊,怎么办啊?”答曰“加法线”,”做了个高模,准备烘一下法线贴图”,“有的美术特别屌,直接画法线贴图”.....法线贴图到底是个什么鬼,当年天真的我真的被这个图形学的奇淫 ...

  8. 一张图看懂Rxjava的原理

    前言 Rxjava是NetFlix出品的Java框架, 官方描述为 a library for composing asynchronous and event-based programs usin ...

  9. 遇到别人留下的storyboard的,你需要一个引导图,但是不知道怎么跳转.

    首先在AppDeledate.m文件里是这样. { self.window = [[UIWindow alloc]initWithFrame:[UIScreen mainScreen].bounds] ...

随机推荐

  1. android inline hook

    最近终于沉下心来对着书把hook跟注入方面的代码敲了一遍,打算写几个博客把它们记录下来. 第一次介绍一下我感觉难度最大的inline hook,实现代码参考了腾讯GAD的游戏安全入门. inline ...

  2. Linux 定时任务不生效的问题

    Linux 中定时任务不生效的问题屡见不鲜, 本质原因是: 登录式 shell & 非登录式 shell. 登录式 shell & 非登录式 shell 登录式 shell 有: su ...

  3. angular4.0运行在微信端的坑坑洼洼

    最近的一个项目,我用ng4操刀,踩了超多的坑: 坑1:项目build后,刷新后404错误: 解决方案:<angular4.0项目build发布后,刷新页面报错404> 坑2:微信分享: 运 ...

  4. File API文件操作之FileReader二

    上一篇说了FileAPI中FileReader的readAsText,这里继续上文,说说另外一个API readAsDataURL. 这个接口是将File或者Blob读成base64格式的字符串,然后 ...

  5. 移动端页面 css reset

    这个是通用的  css reset.这个版本适用于 移动端页面 如果需要在 PC端使用,可以 修改 html{font-size: 10px;}为html{font-size: 12px;} 其他地方 ...

  6. HTML 中有用的字符实体

    HTML 中有用的字符实体

  7. SQLserver中小数点怎么自定义取的问题

    第一次写博客,正好我也在写作业的时候遇到了这个问题,所以就看看 我正在写T-SQL的代码!在经过计算后 结果的小数点多了几位,很烦躁,所以百度了一个方法"round(数字,保留几位小数),两 ...

  8. node实现微信扫码群发消息《附上github代码》

    本篇文章就是为大家介绍一下我是如何用node去实现扫码群发功能,源代码地址在最后面 获取登录二维码 -> 扫码登录服务端           首先介绍一下主要流程,并附上关键代码 1.获取UUI ...

  9. [转载]innodb 的预读

    innodb在io的优化上有个比较重要的特性为预读,innodb以64个page为一个extent,那么innodb的预读是以page为单位还是以extent? 这样就进入了下面的话题:linear ...

  10. Java之CountDownLatch ---控制线程执行顺序

    一,类介绍 这是java.util.concurrent包里的一个同步辅助类,它有两个主要的常用方法  countDown()方法以及await()方法.在完成一组正在其他线程中执行的操作之前,它允许 ...