图形学经常涉及连续变量的函数。表示这种函数的最常用的方法是用函数的样本 (samples):只保存一个离散点集上的函数值,需要时再对整个函数重构 (reconstruct)。常见的例子有:栅格图、触笔在数字面板上的运动、动作捕捉 (motion capture)系统、医用 CT 扫描仪等。对于栅格图,重构可用于放大缩小。
函数的样本表示 (sampled representations)应用于很多领域,如数字音频 (digital audio)、计算物理等,图形学只是相关算法和数学的使用者之一。从 20 世纪 20 年代开始,采样和重构在通信领域就已经为人所知,到 20 世纪 40 年代,就已经表述为如今所使用的形式。
数字音频:一维采样
1982 年推出的 CD 光盘 (compact disc)是采样的第一个广为人知的应用。录音时,麦克风把声音转化为电压,然后存储在某种媒介上;播放时,扬声器将电压转化为声音。
数字录音就是采样:模数转换器 (analog-to-digital converter,也称为 A/D converter,简称 ADC)每秒钟测量几千次电压,并将测量结果存储到某种媒介上。播放时,数模转换器 (digital-to-analog converter,也称为 D/A converter,简称 DAC)以合适的速率读取数据,并生成相应的电压。
高质量复现录制结果所需的采样频率依赖于声音中的高频成分。为了避免欠采样失真 (undersampling artifacts),数字录音机在输入给 ADC 之前,先过滤掉高频信号。为了消除重构失真 (reconstruction artifacts),数字音频播放器对 DAC 的输出进行滤波,以保证波形光滑。
欠采样失真和重构失真在图形学中也会出现,解决方案也一样:采样前滤波、重构时滤波。下图是采样失真的一个例子:
可以看出,如果采样频率较低,高频信号会“伪装”成低频信号,这一现象称为混淆 (aliasing)。图像中的混淆通常以莫尔条纹 (moire patterns)的形式出现,它源于样本网格和图像中规则特征之间的相互作用。阶梯状直线也是混淆现象的一个例子,这种小尺度特征甚至可以产生大尺度失真。
卷积(Convolution)
卷积是采样、滤波和重构算法的基础。卷积是函数的二元运算,记为 f ⋆ g f\star g f ⋆ g 。
滑动平均(Moving Averages)
最简单的光滑处理方法是在半径 (radius)为 r r r 的范围内对函数求平均。对于连续变量的函数:
h ( x ) = 1 2 r ∫ x − r x + r g ( t ) d t h(x) = \frac{1}{2r}\int_{x-r}^{x+r}g(t)dt h ( x ) = 2 r 1 ∫ x − r x + r g ( t ) d t
对于离散函数:
c [ i ] = 1 2 r + 1 ∑ j = i − r i + r a [ j ] c[i] = \frac{1}{2r + 1}\sum_{j=i-r}^{i+r}a[j] c [ i ] = 2 r + 1 1 j = i − r ∑ i + r a [ j ]
滑动平均就是卷积的雏形。
离散型卷积(Discrete Convolution)
卷积 a ⋆ b a\star b a ⋆ b 就是用序列 b b b 对序列 a a a 做加权平均:
( a ⋆ b ) [ i ] = ∑ j = − ∞ + ∞ a [ j ] b [ i − j ] (a\star b)[i] = \sum_{j=-\infty}^{+\infty}a[j]b[i-j] ( a ⋆ b ) [ i ] = j = − ∞ ∑ + ∞ a [ j ] b [ i − j ]
通常在图形学中,两个函数中有一个(假设为 b b b )支集有限 (finite support)。也就是说,存在半径 r r r 使得:∣ k ∣ > r |k|>r ∣ k ∣ > r 时,b [ k ] = 0 b[k]=0 b [ k ] = 0 。此时:
( a ⋆ b ) [ i ] = ∑ j = i − r i + r a [ j ] b [ i − j ] (a\star b)[i] = \sum_{j=i-r}^{i+r}a[j]b[i-j] ( a ⋆ b ) [ i ] = j = i − r ∑ i + r a [ j ] b [ i − j ]
伪代码如下:
function convolve(sequence a , filter b , int i ) s = 0 r = b . radius for j = i − r to i + r do s = s + a [ j ] b [ i − j ] return s \begin{aligned}
&\text{\textbf{function} convolve(sequence $a$, filter $b$, int $i$)} \\
&\quad\begin{aligned}
&s = 0 \\
&r = b.\text{radius} \\
&\text{\textbf{for} $j=i-r$ to $i+r$ \textbf{do}} \\
&\quad s = s + a[j]b[i-j] \\
&\textbf{return $s$}
\end{aligned}
\end{aligned} function convolve(sequence a , filter b , int i ) s = 0 r = b . radius for j = i − r to i + r do s = s + a [ j ] b [ i − j ] return s
卷积的一个重要应用是滤波,前面的滑动平均就是卷积的一个例子,它的滤波器 b b b 形式如下:
b [ k ] = { 1 2 r + 1 , − r ⩽ k ⩽ r 0 , otherwise b[k] =
\left\{
\begin{aligned}
&\frac{1}{2r+1}, &&-r\leqslant k\leqslant r \\
&0, &&\text{otherwise}
\end{aligned}
\right. b [ k ] = ⎩ ⎨ ⎧ 2 r + 1 1 , 0 , − r ⩽ k ⩽ r otherwise
这种滤波器称为箱式滤波器 (box filter)。阶梯函数 (step function)做箱式滤波后会变成一个线性斜坡形函数。通常约定卷积滤波器的积分(求和)为 1 1 1 ,以保证整体信号强度不受影响。
实际上,参与卷积的两个函数是对称的,也就是说,滤波器 (filter)和信号 (signal)可以互换。除了交换律 (commutative law)之外,卷积还满足结合律 (associative law)和分配率 (distributive law):
a ⋆ b = b ⋆ a ( a ⋆ b ) ⋆ c = a ⋆ ( b ⋆ c ) a ⋆ ( b + c ) = a ⋆ b + a ⋆ c \begin{aligned}
a\star b &= b\star a \\
(a\star b)\star c &= a\star (b\star c) \\
a\star(b + c) &= a\star b + a\star c
\end{aligned} a ⋆ b ( a ⋆ b ) ⋆ c a ⋆ ( b + c ) = b ⋆ a = a ⋆ ( b ⋆ c ) = a ⋆ b + a ⋆ c
离散型恒等滤波器 (discrete identity filter)是一种非常简单的滤波器,也称为离散脉冲 (discrete impulse):
d [ k ] = δ k 0 = { 1 , k = 0 0 , k ≠ 0 d[k] = \delta_{k0} =
\left\{
\begin{aligned}
&1, &&k = 0 \\
&0, &&k\neq 0
\end{aligned}
\right. d [ k ] = δ k 0 = { 1 , 0 , k = 0 k = 0
其中,δ i j \delta_{ij} δ ij 是克罗内克符号(Kronecker delta)。
恒等滤波器对信号本身没有任何影响:a = a ⋆ d a=a\star d a = a ⋆ d 。信号 a a a 在滤波器 b b b 过滤前后的差别可以借助 d d d 来表示:
a − a ⋆ b = a ⋆ ( d − b ) a - a\star b = a\star(d - b) a − a ⋆ b = a ⋆ ( d − b )
根据原始定义,卷积还可以看作序列 b b b 移位后以 a a a 为权重加权求和:
a ⋆ b = ∑ j = − ∞ + ∞ a [ j ] b → j a\star b = \sum_{j=-\infty}^{+\infty}a[j]b_{\rightarrow j} a ⋆ b = j = − ∞ ∑ + ∞ a [ j ] b → j
其中,序列 b → j b_{\rightarrow j} b → j 是序列 b b b 沿正方向移动 j j j 后的结果:
b → j [ i ] = b [ i − j ] b_{\rightarrow j}[i] = b[i - j] b → j [ i ] = b [ i − j ]
连续型卷积(Continuous Convolution)
连续型卷积定义如下:
( f ⋆ g ) ( x ) = ∫ − ∞ + ∞ f ( t ) g ( x − t ) d t (f\star g)(x) = \int_{-\infty}^{+\infty}f(t)g(x-t)dt ( f ⋆ g ) ( x ) = ∫ − ∞ + ∞ f ( t ) g ( x − t ) d t
与离散型卷积类似,连续型卷积也可看作滤波器加权的滑动平均,也具有交换律、结合律和分配率。
连续型卷积也可看作滤波器 g g g 移位后的加权求和:
f ⋆ g = ∫ − ∞ + ∞ f ( t ) g → t d t f\star g = \int_{-\infty}^{+\infty}f(t)g_{\rightarrow t}dt f ⋆ g = ∫ − ∞ + ∞ f ( t ) g → t d t
上式就是二元函数 f ( t ) g → t ( x ) f(t)g_{\rightarrow t}(x) f ( t ) g → t ( x ) 对变量 t t t 积分。
对于下面的箱函数 (box function):
f ( x ) = { 1 , − 1 2 ⩽ x < 1 2 0 , otherwise f(x) =
\left\{
\begin{aligned}
&1, &&-\frac{1}{2}\leqslant x<\frac{1}{2} \\
&0, &&\text{otherwise}
\end{aligned}
\right. f ( x ) = ⎩ ⎨ ⎧ 1 , 0 , − 2 1 ⩽ x < 2 1 otherwise
可以计算:
( f ⋆ f ) ( x ) = { 1 − ∣ x ∣ , − 1 < x < 1 0 , otherwise (f\star f)(x) =
\left\{
\begin{aligned}
&1 - |x|, &&-1 < x < 1 \\
&0, &&\text{otherwise}
\end{aligned}
\right. ( f ⋆ f ) ( x ) = { 1 − ∣ x ∣ , 0 , − 1 < x < 1 otherwise
上式称为帐篷函数 (tent function),也是一种常用的滤波器。
连续型卷积中也存在一个特殊的恒等函数 (identity function),称为狄拉克脉冲 (Dirac impulse)或狄拉克函数 (Dirac delta function),定义如下:
{ ∫ − ∞ + ∞ δ ( x ) d x = 1 δ ( x ) = 0 , x ≠ 0 \left\{
\begin{aligned}
&\int_{-\infty}^{+\infty}\delta(x)dx = 1 \\
&\delta(x) = 0, x\neq 0
\end{aligned}
\right. ⎩ ⎨ ⎧ ∫ − ∞ + ∞ δ ( x ) d x = 1 δ ( x ) = 0 , x = 0
狄拉克函数具有挑选性:
∫ − ∞ + ∞ f ( x ) δ ( x − x 0 ) d x = f ( x 0 ) \int_{-\infty}^{+\infty}f(x)\delta(x-x_{0})dx = f(x_{0}) ∫ − ∞ + ∞ f ( x ) δ ( x − x 0 ) d x = f ( x 0 )
容易计算 f = f ⋆ δ f = f\star\delta f = f ⋆ δ 。
混合型卷积(Discrete-Continueous Convolution)
连接离散和连续的方式有两种。其一是采样,对连续变量的函数 g g g 采样可以得到离散序列 a a a :
a [ i ] = g ( i ) a[i] = g(i) a [ i ] = g ( i )
其二是重构 ,使用混合型卷积,即,使用连续型滤波器 f f f 对离散序列 a a a 滤波,可以重构出连续变量的函数:
( a ⋆ f ) ( x ) = ∑ i = − ∞ + ∞ a [ i ] f ( x − i ) (a\star f)(x) = \sum_{i=-\infty}^{+\infty}a[i]f(x - i) ( a ⋆ f ) ( x ) = i = − ∞ ∑ + ∞ a [ i ] f ( x − i )
实际上,混合型卷积就是一种特殊的连续型卷积 ,只要为离散序列配上狄拉克梳 (Dirac comb,详见后文),或者用狄拉克梳对原始连续信号 g g g 采样,就可以把混合型卷积表示为连续型卷积 a ⋆ f = ( s 1 g ) ⋆ f a\star f=(s_{1}g)\star f a ⋆ f = ( s 1 g ) ⋆ f ,其中 s 1 s_{1} s 1 是周期为 1 1 1 的狄拉克梳。
上式表明 ( a ⋆ f ) ( x ) (a\star f)(x) ( a ⋆ f ) ( x ) 就是序列 a a a 在 x x x 附近的加权和。
如果滤波器 f f f 的半径为 r r r ,则卷积可以简化为:
( a ⋆ f ) ( x ) = ∑ i = ⌈ x − r ⌉ ⌊ x + r ⌋ a [ i ] f ( x − i ) (a\star f)(x) = \sum_{i=\lceil x-r\rceil}^{\lfloor x+r\rfloor}a[i]f(x - i) ( a ⋆ f ) ( x ) = i = ⌈ x − r ⌉ ∑ ⌊ x + r ⌋ a [ i ] f ( x − i )
伪代码如下:
function reconstruct(sequence a , filter f , real x ) s = 0 r = f . radius for i = ⌈ x − r ⌉ to ⌊ x + r ⌋ do s = s + a [ i ] f ( x − i ) return s \begin{aligned}
&\text{\textbf{function} reconstruct(sequence $a$, filter $f$, real $x$)} \\
&\quad\begin{aligned}
&s = 0 \\
&r = f.\text{radius} \\
&\text{\textbf{for} $i=\lceil x-r\rceil$ to $\lfloor x+r\rfloor$ \textbf{do}} \\
&\quad s = s + a[i]f(x-i) \\
&\textbf{return $s$}
\end{aligned}
\end{aligned} function reconstruct(sequence a , filter f , real x ) s = 0 r = f . radius for i = ⌈ x − r ⌉ to ⌊ x + r ⌋ do s = s + a [ i ] f ( x − i ) return s
混合型卷积也可以看作滤波器移位之和:
a ⋆ f = ∑ i = − ∞ + ∞ a [ i ] f → i a\star f = \sum_{i=-\infty}^{+\infty}a[i]f_{\rightarrow i} a ⋆ f = i = − ∞ ∑ + ∞ a [ i ] f → i
高维卷积
采样算法和相关理论可以直接推广到高维,下面以二维为例进行说明。
二维离散型卷积:
( a ⋆ b ) [ i , j ] = ∑ i ′ = − ∞ + ∞ ∑ j ′ = − ∞ + ∞ a [ i ′ , j ′ ] b [ i − i ′ , j − j ′ ] (a\star b)[i, j] = \sum_{i'=-\infty}^{+\infty}\sum_{j'=-\infty}^{+\infty}a[i', j']b[i-i', j-j'] ( a ⋆ b ) [ i , j ] = i ′ = − ∞ ∑ + ∞ j ′ = − ∞ ∑ + ∞ a [ i ′ , j ′ ] b [ i − i ′ , j − j ′ ]
如果滤波器 b b b 支集有限,且半径为 r r r ,则可以简化为:
( a ⋆ b ) [ i , j ] = ∑ i ′ = i − r i + r ∑ j ′ = j − r j + r a [ i ′ , j ′ ] b [ i − i ′ , j − j ′ ] (a\star b)[i, j] = \sum_{i'=i-r}^{i+r}\sum_{j'=j-r}^{j+r}a[i', j']b[i-i', j-j'] ( a ⋆ b ) [ i , j ] = i ′ = i − r ∑ i + r j ′ = j − r ∑ j + r a [ i ′ , j ′ ] b [ i − i ′ , j − j ′ ]
伪代码如下:
function convolve2d(sequence2d a , filter2d b , int i , int j ) s = 0 r = b . radius for i ′ = i − r to i + r do for j ′ = j − r to j + r do s = s + a [ i ′ ] [ j ′ ] b [ i − i ′ ] [ j − j ′ ] return s \begin{aligned}
&\text{\textbf{function} convolve2d(sequence2d $a$, filter2d $b$, int $i$, int $j$)} \\
&\quad\begin{aligned}
&s = 0 \\
&r = b.\text{radius} \\
&\text{\textbf{for} $i'=i-r$ to $i+r$ \textbf{do}} \\
&\quad\begin{aligned}
&\text{\textbf{for} $j'=j-r$ to $j+r$ \textbf{do}} \\
&\quad s = s + a[i'][j']b[i-i'][j-j']
\end{aligned} \\
&\textbf{return}\ s
\end{aligned}
\end{aligned} function convolve2d(sequence2d a , filter2d b , int i , int j ) s = 0 r = b . radius for i ′ = i − r to i + r do for j ′ = j − r to j + r do s = s + a [ i ′ ] [ j ′ ] b [ i − i ′ ] [ j − j ′ ] return s
二维连续型卷积:
( f ⋆ g ) ( x , y ) = ∫ x ′ = − ∞ + ∞ ∫ y ′ = − ∞ + ∞ f ( x ′ , y ′ ) g ( x − x ′ , y − y ′ ) d x ′ d y ′ (f\star g)(x, y) = \int_{x'=-\infty}^{+\infty}\int_{y'=-\infty}^{+\infty}f(x', y')g(x-x', y-y')dx'dy' ( f ⋆ g ) ( x , y ) = ∫ x ′ = − ∞ + ∞ ∫ y ′ = − ∞ + ∞ f ( x ′ , y ′ ) g ( x − x ′ , y − y ′ ) d x ′ d y ′
二维混合型卷积:
( a ⋆ f ) ( x , y ) = ∑ i = − ∞ + ∞ ∑ j = − ∞ + ∞ a [ i , j ] f ( x − i , y − j ) (a\star f)(x, y) = \sum_{i=-\infty}^{+\infty}\sum_{j=-\infty}^{+\infty}a[i, j]f(x-i, y-j) ( a ⋆ f ) ( x , y ) = i = − ∞ ∑ + ∞ j = − ∞ ∑ + ∞ a [ i , j ] f ( x − i , y − j )
与一维情形类似,二维卷积可以理解为在一个区域内对输入加权平均,滤波器决定了权重。
卷积滤波器(Convolution Filters)
本节主要介绍图形学中常用的滤波器,这些滤波器都有一个自然半径 (natural radius),它是信号采样和重构的默认尺寸。
任何滤波器 f f f 都可以定义相应的伸缩版本:
f s ( x ) = f ( x / s ) s f_{s}(x) = \frac{f(x/s)}{s} f s ( x ) = s f ( x / s )
f s f_{s} f s 是将 f f f 水平拉伸 s s s 倍,再垂直压缩为原有的 1 / s 1/s 1/ s 之后的结果。如果 f f f 的自然半径是 r r r ,那么 f s f_{s} f s 的半径就是 s r sr sr 。
常用的卷积滤波器
箱式滤波器(Box Filter)
箱式滤波器是一个分段常函数。离散型箱式滤波器:
a box , r [ i ] = { 1 / ( 2 r + 1 ) , ∣ i ∣ ⩽ r 0 , otherwise a_{\text{box}, r}[i] =
\left\{
\begin{aligned}
&1/(2r+1), &&|i|\leqslant r \\
&0, &&\text{otherwise}
\end{aligned}
\right. a box , r [ i ] = { 1/ ( 2 r + 1 ) , 0 , ∣ i ∣ ⩽ r otherwise
连续型箱式滤波器:
f box , r ( x ) = { 1 / ( 2 r ) , − r ⩽ x < r 0 , otherwise f_{\text{box}, r}(x) =
\left\{
\begin{aligned}
&1/(2r), &&-r\leqslant x<r \\
&0, &&\text{otherwise}
\end{aligned}
\right. f box , r ( x ) = { 1/ ( 2 r ) , 0 , − r ⩽ x < r otherwise
由于箱式滤波器有间断点,因此边界(boundary)的处理至关重要。之所以约定连续型箱式滤波器只取一个端点,即 f box , r ( − r ) = 1 / ( 2 r ) f_{\text{box}, r}(-r)=1/(2r) f box , r ( − r ) = 1/ ( 2 r ) 、f box , r ( r ) = 0 f_{\text{box}, r}(r)=0 f box , r ( r ) = 0 ,是为了避免重构函数时覆盖的点数发生突变。一般约定箱式滤波器的自然半径为 r = 1 / 2 r=1/2 r = 1/2 ,此时的箱式滤波器记为 f box f_{\text{box}} f box 。
帐篷式滤波器(Tent Filter)
帐篷式滤波器,也称为线性滤波器 (linear filter),是一个分段线性函数:
f tent ( x ) = { 1 − ∣ x ∣ , ∣ x ∣ < 1 0 , otherwise f_{\text{tent}}(x) =
\left\{
\begin{aligned}
&1-|x|, &&|x|<1 \\
&0, &&\text{otherwise}
\end{aligned}
\right. f tent ( x ) = { 1 − ∣ x ∣ , 0 , ∣ x ∣ < 1 otherwise
自然半径约定为 1 1 1 。
C 0 C^{0} C 0 类(即连续函数)滤波器无需区分离散型和连续型,离散型滤波器就是连续型滤波器的采样。
高斯滤波器(Gaussian Filter)
高斯函数 (Gaussian function),又名正态分布 (normal distribution),是一种在理论和应用上都很重要的滤波器:
f g , σ ( x ) = 1 σ 2 π e − x 2 / 2 σ 2 f_{g, \sigma}(x) = \frac{1}{\sigma\sqrt{2\pi}}e^{-x^{2}/2\sigma^{2}} f g , σ ( x ) = σ 2 π 1 e − x 2 /2 σ 2
参数 σ \sigma σ 称为标准差 (standard deviation)。高斯滤波器没有任何特殊的自然半径。实际应用中,常把超出半径 r r r 的尾部截断,所得结果称为截断高斯函数 (trimmed Gaussian function),σ \sigma σ 和 r r r 是滤波器的参数。而伸缩变换只会改变参数 σ \sigma σ 、r r r ,不会产生新的滤波器。滤波器的宽度和自然半径依赖于具体应用场景。
通常,σ = 1 \sigma=1 σ = 1 、r = 3 r=3 r = 3 是一个好的切入点。
三次 B 样条滤波器(B-Spline Cubic Filter)
很多滤波器都定义为分段多项式。自然半径为 2 2 2 的四段三次滤波器常用于信号重构,B 样条滤波器就是其中之一:
f B ( x ) = 1 6 { − 3 ( 1 − ∣ x ∣ ) 3 + 3 ( 1 − ∣ x ∣ ) 2 + 3 ( 1 − ∣ x ∣ ) + 1 , ∣ x ∣ ⩽ 1 ( 2 − ∣ x ∣ ) 3 , 1 < ∣ x ∣ ⩽ 2 0 , otherwise f_{B}(x) = \frac{1}{6}
\left\{
\begin{aligned}
&-3(1-|x|)^{3} + 3(1-|x|)^{2} + 3(1-|x|) + 1, &&|x|\leqslant 1 \\
&(2-|x|)^{3}, &&1<|x|\leqslant 2 \\
&0, &&\text{otherwise}
\end{aligned}
\right. f B ( x ) = 6 1 ⎩ ⎨ ⎧ − 3 ( 1 − ∣ x ∣ ) 3 + 3 ( 1 − ∣ x ∣ ) 2 + 3 ( 1 − ∣ x ∣ ) + 1 , ( 2 − ∣ x ∣ ) 3 , 0 , ∣ x ∣ ⩽ 1 1 < ∣ x ∣ ⩽ 2 otherwise
B 样条滤波器是 C 2 C^{2} C 2 函数,即二阶导数连续。除了上式,B 样条滤波器还有一种更简洁的定义:f B = f box ⋆ f box ⋆ f box ⋆ f box f_{B}=f_{\text{box}}\star f_{\text{box}}\star f_{\text{box}}\star f_{\text{box}} f B = f box ⋆ f box ⋆ f box ⋆ f box 。
三次 Catmull-Rom 滤波器(Catmull-Rom Cubic Filter)
Catmull-Rom 滤波器也是一种分段三次样条滤波器:
f C ( x ) = 1 2 { − 3 ( 1 − ∣ x ∣ ) 3 + 4 ( 1 − ∣ x ∣ ) 2 + ( 1 − ∣ x ∣ ) , ∣ x ∣ ⩽ 1 ( 2 − ∣ x ∣ ) 3 − ( 2 − ∣ x ∣ ) 2 , 1 < ∣ x ∣ ⩽ 2 0 , otherwise f_{C}(x) = \frac{1}{2}
\left\{
\begin{aligned}
&-3(1-|x|)^{3} + 4(1-|x|)^{2} + (1-|x|), &&|x|\leqslant 1 \\
&(2-|x|)^{3} - (2-|x|)^{2}, &&1<|x|\leqslant 2 \\
&0, &&\text{otherwise}
\end{aligned}
\right. f C ( x ) = 2 1 ⎩ ⎨ ⎧ − 3 ( 1 − ∣ x ∣ ) 3 + 4 ( 1 − ∣ x ∣ ) 2 + ( 1 − ∣ x ∣ ) , ( 2 − ∣ x ∣ ) 3 − ( 2 − ∣ x ∣ ) 2 , 0 , ∣ x ∣ ⩽ 1 1 < ∣ x ∣ ⩽ 2 otherwise
三次 Mitchell-Netravali 滤波器(Mitchell-Netravali Cubic Filter)
Mitchell-Netravali 滤波器是前两种滤波器的加权组合:
f M ( x ) = 1 3 f B ( x ) + 2 3 f C ( x ) = 1 18 { − 21 ( 1 − ∣ x ∣ ) 3 + 27 ( 1 − ∣ x ∣ ) 2 + 9 ( 1 − ∣ x ∣ ) + 1 , ∣ x ∣ ⩽ 1 7 ( 2 − ∣ x ∣ ) 3 − 6 ( 2 − ∣ x ∣ ) 2 , 1 < ∣ x ∣ ⩽ 2 0 , otherwise \begin{aligned}
f_{M}(x) &= \frac{1}{3}f_{B}(x) + \frac{2}{3}f_{C}(x) \\
&= \frac{1}{18}
\left\{
\begin{aligned}
&-21(1-|x|)^{3} + 27(1-|x|)^{2} + 9(1-|x|) + 1, &&|x|\leqslant 1 \\
&7(2-|x|)^{3} - 6(2-|x|)^{2}, &&1<|x|\leqslant 2 \\
&0, &&\text{otherwise}
\end{aligned}
\right.
\end{aligned} f M ( x ) = 3 1 f B ( x ) + 3 2 f C ( x ) = 18 1 ⎩ ⎨ ⎧ − 21 ( 1 − ∣ x ∣ ) 3 + 27 ( 1 − ∣ x ∣ ) 2 + 9 ( 1 − ∣ x ∣ ) + 1 , 7 ( 2 − ∣ x ∣ ) 3 − 6 ( 2 − ∣ x ∣ ) 2 , 0 , ∣ x ∣ ⩽ 1 1 < ∣ x ∣ ⩽ 2 otherwise
滤波器的性质
脉冲响应 (impulse response)就是滤波器对脉冲信号的响应。由于脉冲信号是卷积运算中的恒等函数,因此脉冲响应其实就是滤波器的别名。
当连续型滤波器被用于信号重构时,如果重构前后样本点处的值保持不变——重构后的函数把样本点串了起来,则称这种滤波器为插值滤波器 (interpolating filter)。容易知道,插值滤波器就是满足如下条件的滤波器:
{ f ( 0 ) = 1 f ( i ) = 0 , ∀ i ≠ 0 \left\{
\begin{aligned}
&f(0) = 1 \\
&f(i) = 0,\ \forall i\neq 0
\end{aligned}
\right. { f ( 0 ) = 1 f ( i ) = 0 , ∀ i = 0
对于有负值的滤波器,当原始信号急剧变化时,过滤后的信号会出现振荡 (ringing)或过冲 (overshoot)。
能把常数序列重构为常函数的连续型滤波器称为无波纹的 (ripple free)。无波纹滤波器的数学表述如下:
∑ i = − ∞ + ∞ f ( x + i ) = 1 , ∀ x ∈ R \sum_{i=-\infty}^{+\infty}f(x + i) = 1,\ \forall x\in\mathbb{R} i = − ∞ ∑ + ∞ f ( x + i ) = 1 , ∀ x ∈ R
除了高斯滤波器,上一小节中列举的所有常用滤波器在自然半径下都是无波纹的。但是在非自然半径下,都有可能出现波纹。在混合型卷积中消除波纹的一种简单方法是除以权重和:
( a ⋆ f ‾ ) ( x ) = ∑ i = − ∞ + ∞ a [ i ] f ( x − i ) ∑ i = − ∞ + ∞ f ( x − i ) = ( a ⋆ f ˉ ) ( x ) f ˉ ( x ) = f ( x ) ∑ i = − ∞ + ∞ f ( x − i ) \begin{gathered}
(\overline{a\star f})(x) = \frac{\displaystyle\sum_{i=-\infty}^{+\infty}a[i]f(x-i)}{\displaystyle\sum_{i=-\infty}^{+\infty}f(x-i)} = (a\star \bar{f})(x) \\
\bar{f}(x) = \frac{f(x)}{\displaystyle\sum_{i=-\infty}^{+\infty}f(x-i)}
\end{gathered} ( a ⋆ f ) ( x ) = i = − ∞ ∑ + ∞ f ( x − i ) i = − ∞ ∑ + ∞ a [ i ] f ( x − i ) = ( a ⋆ f ˉ ) ( x ) f ˉ ( x ) = i = − ∞ ∑ + ∞ f ( x − i ) f ( x )
不同的连续型滤波器可能有不同的连续程度 (degree of continuity),连续程度一般用最高阶连续导数来表述:具有 n n n 阶连续导数的函数称为 C n C^{n} C n 类函数。
可分离滤波器
二维滤波器有时直接使用二元函数来定义,但大多数情况下,都是用已知的一维滤波器来构造二维滤波器。最常用的是可分离滤波器 (separable filter):
f 2 ( x , y ) = f 1 ( x ) f 1 ( y ) b 2 [ i , j ] = b 1 [ i ] b 1 [ j ] \begin{gathered}
f_{2}(x, y) = f_{1}(x)f_{1}(y) \\
b_{2}[i, j] = b_{1}[i]b_{1}[j]
\end{gathered} f 2 ( x , y ) = f 1 ( x ) f 1 ( y ) b 2 [ i , j ] = b 1 [ i ] b 1 [ j ]
相比于其它二维滤波器,可分离滤波器更加高效。对于离散型卷积,容易知道:
( a ⋆ b 2 ) [ i , j ] = ∑ i ′ = − ∞ + ∞ b 1 [ i − i ′ ] S j [ i ′ ] S j [ i ′ ] = ∑ j ′ = − ∞ + ∞ a [ i ′ , j ′ ] b 1 [ j − j ′ ] \begin{gathered}
(a\star b_{2})[i, j] = \sum_{i'=-\infty}^{+\infty}b_{1}[i-i']S_{j}[i'] \\
S_{j}[i'] = \sum_{j'=-\infty}^{+\infty}a[i', j']b_{1}[j-j']
\end{gathered} ( a ⋆ b 2 ) [ i , j ] = i ′ = − ∞ ∑ + ∞ b 1 [ i − i ′ ] S j [ i ′ ] S j [ i ′ ] = j ′ = − ∞ ∑ + ∞ a [ i ′ , j ′ ] b 1 [ j − j ′ ]
利用上式,可以先计算 S j [ i ] S_{j}[i] S j [ i ] 并存储起来,然后再使用这些值计算卷积,这对大型滤波器有重要意义。通常,半径为 r r r 的滤波器对图像滤波时,每个像素平均需要计算 ( 2 r + 1 ) 2 (2r+1)^{2} ( 2 r + 1 ) 2 次乘法。如果使用上面的方法,则每个像素计算 2 ( 2 r + 1 ) 2(2r+1) 2 ( 2 r + 1 ) 次乘法即可,当然,代价是更多的存储空间。可分离滤波器让渐进复杂度由 O ( r 2 ) O(r^{2}) O ( r 2 ) 变成了 O ( r ) O(r) O ( r ) ,这让大型滤波器的使用成为可能。上述算法的伪代码如下:
function filterImage(image I , filter b ) r = b . radius n x = I . width n y = I . height allocate storage array S [ 0 , ⋯ , n x − 1 ] allocate image I out [ r , ⋯ , n x − r − 1 ; r , ⋯ , n y − r − 1 ] initialize S and I out to all zero for j = r to n y − r − 1 do for i ′ = 0 to n x − 1 do S [ i ′ ] = 0 for j ′ = j − r to j + r do S [ i ′ ] = S [ i ′ ] + I [ i ′ , j ′ ] b [ j − j ′ ] for i = r to n x − r − 1 do for i ′ = i − r to i + r do I out [ i , j ] = I out [ i , j ] + S [ i ′ ] b [ i − i ′ ] return I out \begin{aligned}
&\text{\textbf{function} filterImage(image $I$, filter $b$)} \\
&\quad\begin{aligned}
&r=b.\text{radius} \\
&n_{x}=I.\text{width} \\
&n_{y}=I.\text{height} \\
&\text{allocate storage array}\ S[0,\cdots,n_{x}-1] \\
&\text{allocate image}\ I_{\text{out}}[r,\cdots,n_{x}-r-1;r,\cdots,n_{y}-r-1] \\
&\text{initialize $S$ and $I_{\text{out}}$ to all zero} \\
&\textbf{for}\ j=r\ \text{to}\ n_{y}-r-1\ \textbf{do} \\
&\quad\begin{aligned}
&\textbf{for}\ i'=0\ \text{to}\ n_{x}-1\ \textbf{do} \\
&\quad\begin{aligned}
&S[i']=0 \\
&\textbf{for}\ j'=j-r\ \text{to}\ j+r\ \textbf{do} \\
&\quad S[i']=S[i']+I[i',j']b[j-j']
\end{aligned} \\
&\textbf{for}\ i=r\ \text{to}\ n_{x}-r-1\ \textbf{do} \\
&\quad\begin{aligned}
&\textbf{for}\ i'=i-r\ \text{to}\ i+r\ \textbf{do} \\
&\quad I_{\text{out}}[i,j]=I_{\text{out}}[i,j]+S[i']b[i-i']
\end{aligned}
\end{aligned} \\
&\textbf{return}\ I_{\text{out}}
\end{aligned}
\end{aligned} function filterImage(image I , filter b ) r = b . radius n x = I . width n y = I . height allocate storage array S [ 0 , ⋯ , n x − 1 ] allocate image I out [ r , ⋯ , n x − r − 1 ; r , ⋯ , n y − r − 1 ] initialize S and I out to all zero for j = r to n y − r − 1 do for i ′ = 0 to n x − 1 do S [ i ′ ] = 0 for j ′ = j − r to j + r do S [ i ′ ] = S [ i ′ ] + I [ i ′ , j ′ ] b [ j − j ′ ] for i = r to n x − r − 1 do for i ′ = i − r to i + r do I out [ i , j ] = I out [ i , j ] + S [ i ′ ] b [ i − i ′ ] return I out
为说明主要问题,上述伪代码没有处理图像边界。
图像信号处理
信号处理在图形学中最重要、最常见的应用场景就是图像处理。
使用离散滤波器做图像滤波
卷积滤波是图像处理软件中最广泛使用的功能。图像的模糊化 (blurring)可以借助常用的低通滤波器 (low-pass filter)来实现。高斯滤波器模糊处理得非常光滑,也最常用。
图像锐化 (sharpening)——模糊化的逆操作——可以使用钝化蒙层 (unsharp mask)来实现,即,在原始图像上减掉模糊化图像,然后再重新标度 (rescaling)以保证整体亮度不变:
I sharp = ( 1 + α ) I − α ( I ⋆ f g , σ ) = I ⋆ ( ( 1 + α ) d − α f g , σ ) = I ⋆ f sharp ( σ , α ) \begin{aligned}
I_{\text{sharp}} &= (1 + \alpha)I - \alpha(I\star f_{g, \sigma}) \\
&= I\star((1 + \alpha)d - \alpha f_{g, \sigma}) \\
&= I\star f_{\text{sharp}}(\sigma, \alpha)
\end{aligned} I sharp = ( 1 + α ) I − α ( I ⋆ f g , σ ) = I ⋆ (( 1 + α ) d − α f g , σ ) = I ⋆ f sharp ( σ , α )
其中,f g , σ f_{g, \sigma} f g , σ 是宽度为 σ \sigma σ 的高斯滤波器。
阴影 (drop shadow)可以借助模糊移位拷贝来实现。移位后模糊化可以表示为:
I shadow = ( I ⋆ d m , n ) ⋆ f g , σ = I ⋆ ( d m , n ⋆ f g , σ ) = I ⋆ f shadow ( m , n , σ ) \begin{aligned}
I_{\text{shadow}} &= (I\star d_{m, n})\star f_{g, \sigma} \\
&= I\star (d_{m, n}\star f_{g, \sigma}) \\
&= I\star f_{\text{shadow}}(m, n, \sigma)
\end{aligned} I shadow = ( I ⋆ d m , n ) ⋆ f g , σ = I ⋆ ( d m , n ⋆ f g , σ ) = I ⋆ f shadow ( m , n , σ )
其中,偏心脉冲 (off-center impulse):
d m , n ( i , j ) = { 1 , i = m and j = n 0 , otherwise = δ i m δ j n \begin{aligned}
d_{m, n}(i, j)
&=
\left\{
\begin{aligned}
&1, &&i=m\ \text{and}\ j=n \\
&0, &&\text{otherwise}
\end{aligned}
\right. \\
&=\delta_{im}\delta_{jn}
\end{aligned} d m , n ( i , j ) = { 1 , 0 , i = m and j = n otherwise = δ im δ jn
容易知道,移位操作 (shifting operation)就是用偏心脉冲做卷积。
图像采样抗锯齿
图像合成 (image synthesis)中经常需要根据连续模型生成图像的样本表示,也就是在二维规则点阵上对连续信号采样。如果不做任何处理,则会产生各种混淆失真 (aliasing artifacts),比如,锯齿 (jaggies)——图像中锐利边界上的阶梯状失真,莫尔图案 (moire patterns)——有重复图案的区域中出现的宽条带。
问题的根源在于图像本身包含了太多的小尺度特征,因此必须在采样前光滑滤波。高斯滤波器可以有效地消除莫尔图案,但却让整体上更模糊。这说明,滤波器的选择需要在锐度 (sharpness)和混淆之间权衡。
重构(reconstruction)与重采样(resampling)
重采样 (resampling),即改变采样率 (sample rate)或图像尺寸,是一种最常见的应用滤波的图像操作。
缩小图像尺寸的一种简单方法是像素删减 (pixel dropping),即在每个点附近都删掉几个像素以适应新的图像尺寸。这种方法速度很快,但生成的图像质量较低,可用作预览 (preview)。
调整图像大小本质上就是重采样:根据输入样本重构出一个连续变量的函数,然后在新的图像尺寸下对其采样。由于卷积具有结合律,因此可以将重构滤波器和采样滤波器合成之后再对输入信号做卷积,合成后的滤波器称为重采样滤波器 (resampling filter)。例如,像素删减算法——选取输入图像中距离最近的样本点的值作为输出值,其实就完全等价于用宽度为 1 1 1 的箱式滤波器对输入图像重构,然后再点采样 (point-sampling)。
图像重采样时,通常需要指定原图像单位下的一个源矩形 (source rectangle)( x l , x h ) × ( y l , y h ) (x_{l},x_{h})\times(y_{l},y_{h}) ( x l , x h ) × ( y l , y h ) ,它表示原图像中想要保留的部分,借此可将新图像中样本间距表示为 Δ x = ( x h − x l ) / n x new \Delta x=(x_{h}-x_{l})/n_{x}^{\text{new}} Δ x = ( x h − x l ) / n x new 和 Δ y = ( y h − y l ) / n y new \Delta y=(y_{h}-y_{l})/n_{y}^{\text{new}} Δ y = ( y h − y l ) / n y new 。为了简化讨论,下面仅给出一维情形的伪代码,其中 f f f 是重采样滤波器:
function resample(sequence a , float x l , float x h , int n , filter f ) create sequence b of length n r = f . radius x 0 = x l + Δ x / 2 for i = 0 to n − 1 do s = 0 x = x 0 + i Δ x for j = ⌈ x − r ⌉ to ⌊ x + r ⌋ do s = s + a [ j ] f ( x − j ) b [ i ] = s return b \begin{aligned}
&\text{\textbf{function} resample(sequence $a$, float $x_{l}$, float $x_{h}$, int $n$, filter $f$)} \\
&\quad\begin{aligned}
&\text{create sequence $b$ of length $n$} \\
&r = f.\text{radius} \\
&x_{0} = x_{l} + \Delta x/2 \\
&\text{\textbf{for} $i=0$ to $n-1$ \textbf{do}} \\
&\quad\begin{aligned}
&s = 0 \\
&x = x_{0} + i\Delta x \\
&\text{\textbf{for} $j=\lceil x-r\rceil$ to $\lfloor x+r\rfloor$ \textbf{do}} \\
&\quad s = s + a[j]f(x-j) \\
&b[i] = s
\end{aligned} \\
&\textbf{return}\ b
\end{aligned}
\end{aligned} function resample(sequence a , float x l , float x h , int n , filter f ) create sequence b of length n r = f . radius x 0 = x l + Δ x /2 for i = 0 to n − 1 do s = 0 x = x 0 + i Δ x for j = ⌈ x − r ⌉ to ⌊ x + r ⌋ do s = s + a [ j ] f ( x − j ) b [ i ] = s return b
上述伪代码包含了图像重采样的所有基本内容,剩下的唯一问题是图像边缘的处理,下面有三种常见的处理方式:
越过边界时停止循环。这等价于将图像沿所有边界以零信号向外延伸。
把数组的越界访问裁剪到边界。这等价于把图像边缘的最后一行和最后一列向外延伸。
接近信号序列的边界时,修改滤波器以保证不会越界。
用第一种方法处理图像时会产生暗淡边缘 (dim edge)。第二种方法容易实现,但第三种方法效果最好。在图像边缘修正滤波器的最简单的方法是重新归一化 (renormalize):在图像内部对滤波器归一化。这可以保持图像亮度。为了考虑性能,可能还需要把图像中心和图像边缘分开处理。
滤波器的选择对于重采样至关重要。这里主要涉及两个问题:滤波器的形状和尺寸。为了实现信号重构,滤波器应尽可能光滑以避免混淆失真,而且应该是无波纹的。为了对信号采样,滤波器的尺寸应足够大以避免欠采样 (undersampling),而且足够光滑以避免莫尔失真。
通常会选择一种滤波器形状,然后根据输入、输出的相对分辨率来伸缩滤波器。较小的分辨率决定了滤波器的尺寸。当图像缩小时,即降采样 (downsampling),信号采样所需的光滑度高于信号重构,因此用输出信号样本间距作为滤波器尺寸。当图像放大时,即增采样 (upsampling),信号重构所需的光滑度起主导作用,滤波器的尺寸由输入信号样本间距决定。
滤波器的选择需要在速度和质量之间权衡 。常用的有:箱式滤波器——速度至上、帐篷式滤波器——中等质量、分段三次滤波器——高质量。分段三次滤波器的光滑度可以通过对 f B f_{B} f B 和 f C f_{C} f C 插值来调节,Mitchell-Netravali 滤波器是一个好的选择。
和图像滤波类似,可分离滤波器同样可以显著地加速重采样。基本想法是先做行重采样,生成一个宽变高不变的图像,再做列重采样。
采样理论
采样理论可以为采样和重构提供深刻的理解。
傅里叶变换(The Fourier Transform)
傅里叶变换和卷积是采样理论中最重要的数学概念。傅里叶变换就是把函数表示为不同频率的平面波叠加。周期函数可以表示为傅里叶级数 (Fourier series)。而非周期函数可以表示为:
f ( x ) = ∫ − ∞ + ∞ f ^ ( u ) e i 2 π u x d u f(x) = \int_{-\infty}^{+\infty}\hat{f}(u)e^{i2\pi ux}du f ( x ) = ∫ − ∞ + ∞ f ^ ( u ) e i 2 π ux d u
周期函数也可以用傅里叶变换来表示,只不过要在傅里叶级数展开系数上配一个狄拉克函数。
上式也称为傅里叶逆变换 (inverse Fourier transform,简称 IFT)。其中,傅里叶变换 ((forward) Fourier transform,简称 FT)f ^ \hat{f} f ^ :
f ^ ( u ) = ∫ − ∞ + ∞ f ( x ) e − i 2 π u x d x \hat{f}(u) = \int_{-\infty}^{+\infty}f(x)e^{-i2\pi ux}dx f ^ ( u ) = ∫ − ∞ + ∞ f ( x ) e − i 2 π ux d x
f ^ \hat{f} f ^ 是一个复函数,函数值的幅角包含了相应频率的相位信息,它的大小称为傅里叶谱 (Fourier spectrum)。由于傅里叶变换和逆变换的对称性,可以将它们看作是同一种操作。有时采用符号 F { f } \mathcal{F}\{f\} F { f } 表示 f f f 的傅里叶变换,F − 1 { f ^ } \mathcal{F}^{-1}\{\hat{f}\} F − 1 { f ^ } 表示 f ^ \hat{f} f ^ 的傅里叶逆变换。
傅里叶变换具有以下性质:
傅里叶变换是线性变换
F { α f + β g } = α f ^ + β g ^ , ∀ constants α , β \mathcal{F}\{\alpha f + \beta g\} = \alpha\hat{f} + \beta\hat{g},\ \forall\ \text{constants}\ \alpha, \beta F { α f + β g } = α f ^ + β g ^ , ∀ constants α , β
借助狄拉克函数的傅里叶变换可以证明帕塞瓦尔定理 (Parseval's theorem)
∫ − ∞ + ∞ ∣ f ( x ) ∣ 2 d x = ∫ − ∞ + ∞ ∣ f ^ ( u ) ∣ 2 d u \int_{-\infty}^{+\infty}|f(x)|^{2}dx = \int_{-\infty}^{+\infty}|\hat{f}(u)|^{2}du ∫ − ∞ + ∞ ∣ f ( x ) ∣ 2 d x = ∫ − ∞ + ∞ ∣ f ^ ( u ) ∣ 2 d u
其物理含义是实空间和频率空间所观测到的能量相等。
相似性定理
F { f ( x / b ) } = b f ^ ( b u ) , ∀ b ∈ R \mathcal{F}\{f(x/b)\} = b\hat{f}(bu),\ \forall b\in\mathbb{R} F { f ( x / b )} = b f ^ ( b u ) , ∀ b ∈ R
f ^ ( 0 ) \hat{f}(0) f ^ ( 0 ) 代表信号的零频分量,可以理解为 f f f 的平均值。
借助欧拉公式容易知道,如果 f f f 是实函数,那么 R e f ^ \mathrm{Re}\hat{f} Re f ^ 是偶函数,I m f ^ \mathrm{Im}\hat{f} Im f ^ 是奇函数,∣ f ^ ∣ = ( R e f ^ ) 2 + ( I m f ^ ) 2 |\hat{f}|=\sqrt{(\mathrm{Re}\hat{f})^{2}+(\mathrm{Im}\hat{f})^{2}} ∣ f ^ ∣ = ( Re f ^ ) 2 + ( Im f ^ ) 2 是偶函数。如果 f f f 是偶的实函数,那么 f ^ \hat{f} f ^ 是实函数。
卷积定理 :卷积的傅里叶变换等于傅里叶变换的乘积,乘积的傅里叶变换等于傅里叶变换的卷积。
F { f ⋆ g } = f ^ g ^ F { f g } = f ^ ⋆ g ^ \begin{gathered}
\mathcal{F}\{f\star g\} = \hat{f}\hat{g} \\
\mathcal{F}\{fg\} = \hat{f}\star\hat{g}
\end{gathered} F { f ⋆ g } = f ^ g ^ F { f g } = f ^ ⋆ g ^
正因为这些,傅里叶变换在采样和重构的研究中很有用。傅里叶变换提供了频率视角来看待采样、滤波和重构。
常见的傅里叶变换
箱式滤波器的傅里叶变换:
F { f box } = sin π u π u = s i n c π u \mathcal{F}\{f_{\text{box}}\} = \frac{\sin \pi u}{\pi u} = \mathrm{sinc}\ \pi u F { f box } = π u sin π u = sinc π u
借助和箱式滤波器之间的关系,帐篷式滤波器、三次 B 样条滤波器的傅里叶变换为:
F { f tent } = sin 2 π u π 2 u 2 = s i n c 2 π u F { f B } = sin 4 π u π 4 u 4 = s i n c 4 π u \begin{gathered}
\mathcal{F}\{f_{\text{tent}}\} = \frac{\sin^{2}\pi u}{\pi^{2}u^{2}} = \mathrm{sinc}^{2}\pi u \\
\mathcal{F}\{f_{\text{B}}\} = \frac{\sin^{4}\pi u}{\pi^{4}u^{4}} = \mathrm{sinc}^{4}\pi u
\end{gathered} F { f tent } = π 2 u 2 sin 2 π u = sinc 2 π u F { f B } = π 4 u 4 sin 4 π u = sinc 4 π u
借助一点复变函数的知识可以知道高斯函数的傅里叶变换:
F { f g , σ } = e − 2 π 2 σ 2 u 2 \mathcal{F}\{f_{g, \sigma}\} = e^{-2\pi^{2}\sigma^{2}u^{2}} F { f g , σ } = e − 2 π 2 σ 2 u 2
采样理论中的狄拉克脉冲
狄拉克函数可用于对连续变量函数采样。位置 a a a 、值为 b b b 的样本点可以表示为 b δ ( x − a ) b\delta(x-a) b δ ( x − a ) 。而采样则可以表示为原始信号与脉冲序列 (impulse train)的乘积。脉冲序列,也称为狄拉克梳 (Dirac comb):
s T ( x ) = ∑ n = − ∞ + ∞ δ ( x − T n ) s_{T}(x) = \sum_{n=-\infty}^{+\infty}\delta(x - Tn) s T ( x ) = n = − ∞ ∑ + ∞ δ ( x − T n )
狄拉克梳的傅里叶级数和傅里叶变换分别为:
s T ( x ) = 1 T ∑ k = − ∞ + ∞ e i 2 π ( k / T ) x F { s T } = 1 T ∑ k = − ∞ + ∞ δ ( u − k / T ) = 1 T s 1 / T ( u ) \begin{gathered}
s_{T}(x) = \frac{1}{T}\sum_{k=-\infty}^{+\infty}e^{i2\pi(k/T)x} \\
\mathcal{F}\{s_{T}\} = \frac{1}{T}\sum_{k=-\infty}^{+\infty}\delta(u - k/T) = \frac{1}{T}s_{1/T}(u)
\end{gathered} s T ( x ) = T 1 k = − ∞ ∑ + ∞ e i 2 π ( k / T ) x F { s T } = T 1 k = − ∞ ∑ + ∞ δ ( u − k / T ) = T 1 s 1/ T ( u )
上式所表达含义是,如果采样周期是简谐波周期的整数倍,则求和发散为无穷大;否则,求和收敛为零。
采样与混淆
傅里叶变换让卷积滤波器对信号的作用更加清晰。对于连续信号,一般包含各种频率成分,而且大多集中在零频附近,频率越高强度越弱。对连续信号 f f f 的采样可以表示为 f s T fs_{T} f s T ,它的傅里叶变换:
F { f s T } = f ^ ⋆ s T ^ = 1 T f ^ ⋆ s 1 / T \mathcal{F}\{fs_{T}\} = \hat{f}\star\widehat{s_{T}} = \frac{1}{T}\hat{f}\star s_{1/T} F { f s T } = f ^ ⋆ s T = T 1 f ^ ⋆ s 1/ T
又因为,任一函数 g g g 和移位狄拉克函数 δ → x 0 \delta_{\rightarrow x_{0}} δ → x 0 的卷积等价于对函数的移位:
g → x 0 = g ⋆ δ → x 0 g_{\rightarrow x_{0}} = g\star \delta_{\rightarrow x_{0}} g → x 0 = g ⋆ δ → x 0
因此:
( 1 T f ^ ⋆ s 1 / T ) ( u ) = 1 T ∑ k = − ∞ + ∞ f ^ ( u − k / T ) \left(\frac{1}{T}\hat{f}\star s_{1/T}\right)(u) = \frac{1}{T}\sum_{k=-\infty}^{+\infty}\hat{f}(u - k/T) ( T 1 f ^ ⋆ s 1/ T ) ( u ) = T 1 k = − ∞ ∑ + ∞ f ^ ( u − k / T )
也就是说,样本信号 (sampled signal)包含了原始信号谱的无穷多个等距复本。这是因为,对于低频信号的样本点,总可以找到更高频的简谐波穿过它们,因此样本信号谱中包含了这些高频混淆信息。上式中原始信号谱称为基谱 (base spectrum),那些高频复本称为混淆谱 (alias spectra)。
当采样频率较低时,这些信号谱中的复本互相交叠,不同频率的信息被不可逆地混合起来,于是便出现了第一种混淆——源于欠采样 (undersampling)的混淆。
根据卷积定理,重构信号谱其实就是样本信号谱与滤波器谱的乘积。重构信号谱包含两部分:基谱和衰减的混淆谱。如果重构滤波器的谱较宽,比如最近邻重构 (nearest-neighbor reconstruction)——使用宽度为 1 1 1 的箱式滤波器,混淆谱强度较为显著,于是便出现了第二种混淆——不充分的重构滤波器所带来的混淆,这些混淆成分在图像中通常表现为方形图案。
避免采样混淆
为了提高采样和重构的质量,必须适当地选择滤波器。采样前使用低通滤波器对信号滤波,以及提高采样频率,都是为了尽可能地避免混淆谱和基谱的交叠。实际上,采样的基本准则就是信号谱宽必须小于混淆谱和基谱的间距,也就是说,信号的截止频率必须小于采样频率的一半 ,这也被称为奈奎斯特准则 (Nyquist criterion),所允许的信号最高频率称为奈奎斯特频率 (Nyquist frequency)或奈奎斯特极限 (Nyquist limit)。奈奎斯特-香农采样定理 (Nyquist-Shannon sampling theorem)可以表述为:频率不超过奈奎斯特极限的信号原则上可以从样本中精确重构出来。
避免重构混淆
重构滤波器的目的是在保持基谱的前提下消除混淆谱。合理的重构滤波器,首先是低通滤波器,其次还应该满足,在采样频率整数倍的位置取值为零,这等价于滤波器无波纹 。重构滤波器在消除混淆谱的同时,也会让基谱变得光滑,因此需要在光滑和混淆之间权衡。
避免重采样混淆
重采样滤波器为了同时做到重构和采样,必须要消除掉混淆谱,并让谱宽足够窄以保证在新的采样频率下采样。
理想滤波器与实用滤波器
不管是采样还是重构,频域箱式函数都是一种理想的选择。但是相应的滤波器 s i n c π x \mathrm{sinc}\ \pi x sinc π x 宽度过宽,衰减速度过慢,以及滤波器中的负值都会在采样时产生问题。高斯滤波器更加实用,由于指数衰减,它可以有效地从输入信号中移除高频成分,而且高斯函数没有隆起可以保证混淆不泄露。
对于重构而言,有波纹的 s i n c π x \mathrm{sinc}\ \pi x sinc π x 函数还会带来振荡失真。