• 导向滤波算法分析


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

    设引导图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决定。因此可以看到,导向滤波确实可以起到保留边缘的作用。

  • 相关阅读:
    Python3 基本数据类型
    C语言使用以及其它语言经常出的错误
    Deleting array elements in JavaScript
    postgresql 导出建表语句的方法-类似describe table
    什么是分布式系统(通俗易懂的说法)
    什么是分布式系统,分布式系统例子?
    【转】Linux cp -a用法
    [转]Go基础之锁的初识
    fabricJs使用系列(一)
    chrome 的onbeforeunload事件没有触发
  • 原文地址:https://www.cnblogs.com/mightycode/p/8005514.html
Copyright © 2020-2023  润新知