• 导向滤波算法分析


    本文从数学上推导导向滤波的算法,其算法的具体实现在下一篇导向滤波算法的实现介绍。

    设引导图G,输入图像P,输出图像Q。导向滤波的目标是使得输入P和输出Q尽可能相同,同时纹理部分和引导图G相似。

    为了满足第一个目标,使输入P和输出Q尽可能相似,我们要求最小化平方差

    为了满足第二个目标,使输出图像Q的纹理和引导图G的纹理相似,我们要

    积分得到

    考虑一个小窗口Wk,在Wk内认为a,b保持不变,设为ak,bk。Wk内的像素满足

      (1)

    把(1)代入第一个目标,使窗口内的像素同时满足上面两个条件。

      (2)

    其中ε是一个惩罚大的ak的正则化参数。使(2)最小,满足

    其中|W|是窗口Wk的像素总数。解得

      (3)

      (4)

    如果设/pk是输入图P在窗口Wk的平均值,μk和σk2是引导图G在窗口Wk的平均值和方差。我们发现

      (5)

      (6)

    其中是引导图G和输入图P在Wk的协方差。

    计算出ak,bk后,就可以根据(1)来计算窗口Wk的输出像素。对于一个像素i,输出值qi和所有覆盖像素i的窗口Wk有关。所以当Wk不同,qi的值也不相同。一个简单的策略是平均所有可能的qi值。计算了所有覆盖i的窗口Wk的ak,bk,所有覆盖像素i的窗口Wk的个数为|W|,那么

      (7)

      (8)

    其中

    -----------------------------------------

    特别的,当引导图G和输入图像P相同的时候,导向滤波出现边缘保持平滑特性,分析如下。当G=P时,很明显,由式(5)(6)得到。当ε=0时,ak=1,bk=0,即输出和输入图像相同。如果ε>0,考虑两种情况。

    第一种,高方差。如果图像P在窗口Wk中有很多变化,那么σk2>>ε,有ak≈1,bk≈0

    第二种,平坦块。那么σk2<<ε,有ak≈0,bk≈μk。如果整个输入图像都如窗口Wk似的很平坦的,当ak,bk被平均后得到/ak≈0,/bk≈μk,qi≈μk

    这样,当一个像素在高方差的窗口中时,它的输出值是不变的。在平坦区域中,它的输出值变成周围窗口像素的平均值。具体的,高方差和平坦的标准是由参数ε控制的。如果窗口的方差比此参数小的多则被平滑,那么方差大得多的则被保留。而窗口的大小决定了是参考周围多大范围的像素来计算方差和均值。

    ------------------------------------------

    至此,已经可以根据(5)~(8)式计算导向滤波的参数,从而计算输出图像Q。导向滤波的的算法实现在下一篇文章介绍。下面把导向滤波用通用滤波器核来表达进行进一步分析。

    导向滤波在像素点i的滤波结果可以表达为一个加权平均

      (9)

    其中i,j都是像素下标。滤波器核Wij是引导图G的函数并且与P独立。下面计算滤波器核。把(6)带入(8)消去b得到:

      (10)

    求偏导

      (11)

    其中

      (12)

    当j处于窗口Wk时,否则为0

      (13)

    把(12)(13)带入(11)得到

      (14)

    考虑含有边缘阶跃信号的图像,如果i,j在边缘的同一侧,(gik)和(gjk)符号相同,而当它们在边缘的两侧时则符号不同。所以Wij(G)当两个像素点在边缘的两侧时比在相同边时要小得多。这就说明隔着边缘的时候,pj对结果的贡献很小,窗口像素不会平均到一起。而当j和i在边缘的同侧时,输出像素qi是同侧像素的加权平均值。加权系数由导向图G决定。因此可以看到,导向滤波确实可以起到保留边缘的作用。

  • 相关阅读:
    c++中,map的使用
    关于C++中vector<vector<int> >的使用
    python中如何向shell脚本传递带空格的参数
    数组初始化及赋值的方法,memset的使用
    leetcode:首个缺少的最小正整数(js实现。)
    安装cmake过程出错:Error when bootstrapping CMake: Cannot find a C++ compiler that supports both C++11 and the specified C++ flags.
    React系列--三大属性 props refs state
    React系列--组件Component
    React系列--jsx语法及虚拟dom,渲染
    c++的复制构造函数,(郑莉 c++语言程序设计)
  • 原文地址:https://www.cnblogs.com/mightycode/p/8005514.html
Copyright © 2020-2023  润新知