Category:Higher Mathematics & Computer Graphics Application
正文
9 信号处理
9.3 卷积滤波器
现在我们有了卷积机制,让我们来看看图形中常用的一些特殊过滤器。
以下每个过滤器都有一个自然半径,这是当样本间隔一个单位时用于采样或重建的默认大小。
在本节中,过滤器被定义为这个自然大小:例如,盒子过滤器的自然半径为 1/2 ,立方过滤器的自然半径为 2。我们还安排每个过滤器积分到 1:,在不改变信号平均值的情况下进行采样和重构。
正如我们将在第 9.4.3 节中看到的,一些应用程序需要不同大小的过滤器,这可以通过缩放基本过滤器来获得。对于过滤器 f(x),我们可以定义一个版本的 scale s:
过滤器水平拉伸 s 倍,然后垂直挤压 1/s 倍,使其面积不变。一个自然半径为 r 并在尺度 s 上使用的过滤器的支撑半径为 sr(参见下面的图 9.20)。
9.3.1 卷积滤波器库
箱形滤波器(图 9.19)
是一个分段常数函数,其积分等于 1。作为离散滤波器,它可以写成
请注意,为了对称,我们包括两个端点。作为一个连续过滤器,我们写
在这种情况下,我们排除了一个端点,这使得半径为 0.5 的框可用作重建滤波器。正是因为盒子过滤器是不连续的,所以这些边界情况很重要,因此对于这个特定的过滤器,我们需要注意它们。我们只写 fbox 来表示 r = 1/2 的自然半径。
帐篷过滤器
tent 或线性滤波器(图 9.20)是一个连续的分段线性函数:
它的自然半径是 1。对于像这个这样的过滤器,它至少是 C0(也就是说,值没有突然的跳跃,就像盒子一样),我们不再需要分开定义离散和连续滤波器:离散滤波器只是以整数采样的连续滤波器。
高斯滤波器
高斯函数(图 9.21)也称为正态分布,在理论上和实践上都是一个重要的滤波器。随着本章的进行,我们将看到更多它的特殊属性:
参数 σ 称为标准差。 Gaussian 是一个很好的采样滤波器,因为它非常平滑;我们将在本章后面更准确地说明这一说法。 高斯滤波器没有任何特定的自然半径;它是 σ 范围内有用的采样滤波器。高斯也没有有限的支持半径,尽管由于指数衰减,它的值迅速变得小到可以忽略。然后,在必要时,我们可以通过在某个半径 r 之外将其设置为零来修剪函数的尾部,从而得到修剪后的高斯。这意味着滤波器的宽度和自然半径可以根据应用而有所不同,并且按 s 缩放的修剪高斯与具有标准偏差 sσ 和半径 sr 的未缩放修剪高斯相同。在实践中处理此问题的最佳方法是将 σ 和 r 设置为过滤器的属性,在指定过滤器时固定,然后在应用时像其他任何过滤器一样缩放过滤器。
B样条三次滤波器
许多滤波器被定义为分段多项式,四片(自然半径为 2)的三次滤波器通常用作重建滤波器。一种这样的滤波器被称为 B 样条滤波器(图 9.22),因为它起源于样条曲线的混合函数(参见第 15 章):
在分段三次中,B 样条是特殊的,因为它具有连续的一阶和二阶导数——即 C2。定义这个过滤器的更简洁的方法是 证明上面的较长形式是等价的是卷积的一个很好的练习(参见练习 3)。
Catmull-Rom 三次过滤器
另一个以样条曲线命名的分段三次滤波器,Catmull-Rom 滤波器(图 9.23)
,在 x = -2、-1、1 和 2 处的值为零,这意味着当用作重建滤波器时,它将对样本进行插值(第 9.3.2 节):
Mitchell-Netravali 三次滤波器
对于重采样图像的最重要应用,Mitchell 和 Netravali (Mitchell & Netravali, 1988) 对三次过滤器进行了研究,并推荐前两种过滤器之间的中间过滤器作为最佳综合选择(图 9.24)。它只是前两个过滤器的加权组合:
9.3.2 过滤器的属性
过滤器有一些与之配套的传统术语,我们用它来描述过滤器并将它们相互比较。 滤波器的脉冲响应只是该函数的另一个名称:它是滤波器对只包含一个脉冲的信号的响应(回想一下,与脉冲卷积只会返回滤波器)。
如果连续滤波器用于从离散序列重构连续函数时,如果得到的函数准确地采用样本点处的样本值,那么它就是插值——也就是说,它“连接点”而不是产生一个仅靠近点的功能。对于所有非零整数 i,插值滤波器正是那些 f(0) = 1 和 f(i)=0 的滤波器 f(图 9.25)。
采用负值的过滤器具有振铃或过冲:它会在被过滤函数值的急剧变化周围产生额外的值振荡。 例如,Catmull-Rom 滤波器的两侧都有负波瓣,如果你用它过滤阶跃函数,它会稍微夸大阶跃,导致函数值低于 0 和高于 1(图 9.26)。
一个连续滤波器是无波纹的,如果在用作重构滤波器时,它将一个常数序列重构为一个常数函数(图 9.27)
。这等效于在任何整数间隔网格上过滤器总和为 1 的要求:
第 9.3.1 节中的所有滤波器在其自然半径处都是无波纹的,除了高斯,但当它们以非整数尺度使用时,它们都不一定是无波纹的。如果需要消除离散连续卷积中的波纹,这样做很容易:将每个计算的样本除以用于计算它的权重之和:
这个表达式仍然可以解释为 a 和过滤器 f 之间的卷积(参见练习 6)。
连续滤波器具有一定程度的连续性,它是随处定义的最高阶导数。一个过滤器,比如盒子过滤器,它的值有突然的跳跃,它根本不是连续的。一个连续但有尖角(一阶导数不连续)的滤波器,例如帐篷滤波器,其连续性阶数为零,我们说它是 C0。一个具有连续导数(没有尖角)的滤波器,例如上一节中的分段三次滤波器,是 C1;如果它的二阶导数也是连续的,就像 B 样条滤波器一样,它是 C2。滤波器的连续性顺序对于重构滤波器尤为重要,因为重构函数继承了滤波器的连续性。
可分离过滤器
到目前为止,我们只讨论了一维卷积的滤波器,但对于图像和其他多维信号,我们也需要滤波器。通常,任何 2D 函数都可以是 2D 过滤器,有时以这种方式定义它们很有用。但是,在大多数情况下,我们可以从我们已经看到的 1D 过滤器构建合适的 2D(或更高维)过滤器。
最有用的方法是使用可分离过滤器。在特定 x 和 y 处的可分离滤波器 f2(x, y) 的值只是在 x 和 y 处评估的 f1(一维滤波器)的乘积:
同样,对于离散滤波器
通过 f2 的任何水平或垂直切片都是 f1 的缩放副本。 f2 的积分是 f1 的积分的平方,因此特别是如果 f1 被归一化,那么 f2 也是如此。
示例(可分离的帐篷过滤器) 。如果我们为 f1 选择 tent 函数,得到的分段双线性函数(图 9.28)为
沿坐标轴的轮廓是帐篷函数,但沿对角线的轮廓是二次函数(例如,沿着正象限中的线 x = y,我们看到二次函数 (1 - x)2)。
示例(二维高斯滤波器)。如果我们为 f1 选择高斯函数,得到的二维函数(图 9.29)
是
请注意,如果我们围绕原点旋转 1D 高斯以产生圆对称函数,这与我们将获得的函数相同(直到比例因子)。同时圆对称和可分的特性是高斯函数所独有的。沿坐标轴的轮廓是高斯的,但沿任何方向的轮廓在距中心的任何偏移处也是如此。
与其他 2D 过滤器相比,可分离过滤器的主要优势在于实施效率。让我们将 a2 的定义代入离散卷积的定义:
请注意,b1[i - i ' ] 不依赖于 j 并且可以从内部和中分解出来:
让我们将内部和缩写为 S[i ' ]:
使用这种形式的方程,我们可以首先计算并存储 i ' 的每个值的 S[i ' ],然后使用这些存储的值计算外和。乍一看,这似乎并不显着,因为我们仍然必须做与 (2r 1)2 成比例的工作来计算所有内部和。但是,如果我们想计算多个点 [i, j] 的值,情况就完全不同了。
假设我们需要计算 [2, 2] 和 [3, 2] 处的 b2,并且 b1 的半径为 2。
检查公式 9.5,我们可以看到我们需要 S[0],...,S[4] 来计算 [2, 2] 处的结果,我们需要 S[1],...,S[ 5] 计算 [3, 2] 处的结果。
因此,在可分离公式中,我们可以只计算 S 的所有六个值并共享 S[1],...,S[4](图 9.30)。
这种节省对于大型过滤器具有重要意义。在一般情况下,使用半径为 r 的滤波器对图像进行滤波需要每个像素计算 (2r 1)2 个乘积,而使用相同大小的可分离滤波器对图像进行滤波需要 2(2r 1) 个乘积(以牺牲一些中间存储)。渐近复杂度从 O(r2) 到 O(r) 的这种变化使得可以使用更大的滤波器。
算法是:
该算法是: 为简单起见,此函数通过从输出图像的所有四个侧面修剪 r 个像素来避免所有边界问题。在实践中,有多种方法可以处理边界;见第 9.4.3 节。