【读书笔记】计算机图形学基础(虎书)第9章 - 信号处理
本章节建议参考另一位前辈写的笔记,自己整理的较为混乱。
因为计算机按照01 bit储存的特征,其值是离散的。在人眼看显示器的过程中,是将离散值转换成连续值脑补的过程,类似于动画帧数足够,哪怕有间隔看起来也是连续的。与其相反在计算机读入或者储存的时候,需要将连续值转换为离散值。一个常用的方法是采样(sampling)再重建(Reconstruction),可以参考知乎的这个链接。下图是一个典型的录音机模型,将连续的声波转换成磁带内的电压值,再可以通过播放器转换回来。
需要注意sample rate,即选取sample点的间隔是多少,会对结果产生较大影响。例如下图是两个一模一样的连续函数,high rate的上图很好的模拟了原函数,但low rate的下图则完全错误了。实际操作时因为sample rate是固定的,我们需要移除过高频率的连续函数,否则较低的sample rate对这些过高频率函数的采样一定会有错误的结果。在重建的过程中,我们需要使用filter将离散的阶梯状的线变为连续平滑的曲线。在重建的时候,可能存在采样点重建时有两种可能的情况,而我们选择了错误的那一条并产生了奇怪的效果,这样就称为走样(aliasing)或者混叠。为了提高采样与重建的稳定性,显然我们需要选择正确的采样速度,采样与重建的过滤器以及重建曲线的平滑度。
1. 卷积Convolution
一个中文的介绍链接见此知乎回答。卷积会利用两个函数生成一个新的函数,连续或者离散以及domain的维度都可以是多变的,记住里面包含了翻转和滑动两个意思。即\((a\star f)(x)=\sum_i a[i]f[x-i]\)中\(-i\)代表了翻折,\(x\)代表了对齐的滑动。反转的原因是因为过滤器\(f(x)\)代表了一个信号在相对位置x下依然能产生的影响,故\(x-i\)说明的是以\(i\)为坐标系原点,\(x\)在哪里的相对位置,因此\(f[x-i]\)形容的是信号\(a[i]\)能传递到\(x\)节点的比重。
1.1 简单离散卷积
下图是一个简单的离散卷积,其中a代表了值,b代表了权重,卷积结果为加权和。注意b序列中6为原点对应的中心值,然后往外的权重依次减少,同时拥有整体权重和为1的特征(一共十六份,每份1/16)。在实际操作的时候我们通常将b的相对可用范围设置为\([-i,i]\)而不是\((-\infty,\infty)\)。
1.2 过滤器
对于卷积过滤器而言,上文的\(b\)可作为一个简单的box filter,即使用在\([-r,r]\)之间平分1的方法,每份占据\(\frac{1}{2r+1}\)。如下图所示,一个01的阶梯方程经过卷积后成为了一个较为平滑,类似sigmoid函数的样子。
需要注意的是,虽然我们将ab分为了值和权重,但实际上两者是互相影响对称的,在这种思考环境下过滤器也不一定序列和必须为1。卷积操作满足commutative,associative和distributive的特征。如同矩阵乘法一样,我们可以认为\(0,0,0,1,0,0,0\)这样的序列,即仅在原点为1的过滤器为单位1,也被称为discrete impulse。因此,如下的常规algebra操作也是可行的。
1.3 简单连续卷积
对于连续函数而言是类似的,我们将过滤器\(g(x)\)中的原点\(g(0)\)移动至与f(t)对齐,故使用\(g(x-t)\)向右移动t各单位。
与discrete impulse类似,continuous function版本的单位1被称为Dirac Impulse或者Dirac delta function,写作\(\delta(x)\),他拥有除了\(f(0)\)较大以外任何\(f(x)=0\)的性质,如下所示。
1.4 连续与离散空间的转换
连续到离散空间的采样较为简单,可以直接按照采样频率选择离散点即可。重建的过程我们会使用一个连续的filter \(f(x)\)让以下卷积发生。这里要注意虽然a是离散的,但是f是连续的便可以给最后的卷积带来一些连续的变化。卷积的思想可以被轻松拓展到更高维度,这里不做阐述。
2. 卷积过滤器
需要注意过滤器\(f(i)\)代表的是信号在\(i\)轮以后的影响力,拓展多维也是类似的,即基于相对量的影响因子。这一节主要对不同的常用过滤器进行介绍,默认情况下每个过滤器有自己的半径,例如box filter的半径是1/2, cubic filter的半径是2等。同时过滤器的积分应该为1来保持信号的平均值不变。当我们需要改变半径的时候,我们写作\(f_s(x)=\frac{f(x/s)}{s}\),即将宽度拉长s倍,长度降低s倍。分类如下
- Box Filter,平均分布的过滤器,需要注意连续函数需要一边封闭一边开口。
- Tent Filter,三角形分布的过滤器,半径为1,主要与\(1-|x|\)相关。
- Gaussian Filter,正态分布的过滤器,更为平滑。因为正态分布没有边界,我们通常基于需求取一个半径来剪裁正态分布。当进行拉伸操作的时候,我们可以直接选择将standard deviation和选择的半径同时增加s倍即可,因为这样只是横向拉伸但是总体的面积依然为1。本书推荐了一个\(\sigma=1,r=3\)的初始值。
- B-Spline Cubic Filter, 是由分段三阶多项式构成的一个特殊函数,拥有连续的一阶微分和二阶微分,通常的半径为2,值得注意的是它可以写作四个box filter的卷积形式。
- Catmull-Rom Cubic Filter,是上个的修改版,其顶端至1,但是存在一些负数部分在[1,2]之间。
- Mitchell-Netravali Cubic Filter, 结合了上两个filter,分别的权重为1/3和2/3。
另外我们有一些术语,例如Impulse指的是之前的单位1,Impulse Response说的是函数(在单位1的impulse下产生的效果),插值过滤器指重建的函数经过原函数的采样点并连接他们(例如Catmull-Rom filter,\(f(0)=1,f(i)=0\))。
带有负值的过滤器会造成被称为ringing或者overshoot的效果,让原函数值变动较大点在重建函数处有更大的波动性(该点会在前后被用于负值过滤器的部分),如下图所示。
过滤器如果将定值序列重建成定值方程,我们称这个过滤器是ripple free的,这个条件与之前提到的过滤器整数位求和为1是一致的(因为我们使用的是sequence所以不能使用积分的思想,得看成discrete point)。例如下图有四个采样点,半径为1的tent filter是ripple free的但标准差为0.5的正态分布filter则不是的。更为直接的理解方式是如果把一个直线或者稳定的信号采样再重建结果应该也是一个稳定的直线信号。按照求平均值的逻辑可直接得到公式。
我们至此介绍的所有过滤器中除了正态分布以外在标准半径下都是ripple free的,但是拉伸后则需要额外判断。当然我们永远可以选择修正滤波器(P205,看不懂怎么操作的)。另外对于连续的过滤器而言还有degree of continuity的概念,即最高几阶微分在所有地方都是成立的。
对于高维的过滤器而言,有称作separable filter的方法,即将多维设置成1D的连乘形式。例如以下是二维的tent filter与正态分布filter的函数。
这么做的好处是因为双重求和的时候两个维度的值可以如下加以化简,并储存\(S[i]\)的值,在重复利用时直接使用,可大大减少计算量。
3. 图像的信号处理
3.1 常用的过滤器视觉效果
我们可以通过重建过滤器的方法来实现模糊的效果,具体如下
与其相反,我们可以增加一部分强度再减去卷积来达到强化边缘的效果,具体如下
对于平移操作我们可以形成一个过滤器\(d_{m,n}\)让原图信号位移到相对距离\((m,n)\)处,见下。这么一来去掉RGB可以形成一个平移后的阴影。
3.2 处理走样aliasing
如下图所示,采样表示的像素图在人眼还原时会有奇怪的现象发生,例如左侧纱帘上的moire pattern以及右侧直线的抖动与颜色不均。从根本上,走样和清晰度之间存在一个trade off的关系,如果用更平滑的filter则会增加模糊度但是走样的情况会更低。
3.3 重新采样Resample
当改变采样速率以及更改图片大小的时候我们需要重新采样,例如将大屏幕改到小屏幕的过程中我们可以丢掉一部分的像素,也可以利用重新采样的方法来实现,即基于原尺寸重建再采样,一维版本如下由下图可见。要注意的是使用的filter是斜着的两次filter的和。
在改变图片大小时,我们可以选择去掉边缘,加上一个边缘或调整过滤器。一般使用第二种快捷有效的方法或者第三种表现最好的方法。当低维往高维变换时重建过滤器更为重要,高维往低维变换的时候采样过滤器更为重要。实际操作的时候,一般box filter, tent filter和三阶B-spine用的比较多。可分过滤器依然能很大程度上为我们减少计算时间,可以一个维度一个维度的逐步变化而不影响结果。
3. 采样理论
采样理论主要运用到了卷积和傅立叶变换。
3.1 傅立叶变换
傅立叶早期提出了任何连续周期信号都可以由一组适当的正弦曲线组合而成,傅立叶级数使用不同频率的sin函数加权叠加来模拟任何一个函数。后来推导出来的傅立叶变换则去掉了周期信号的条件,对于非周期信号也可以进行模拟(认为其周期无穷大)。其中傅立叶变换将函数转换为基的系数,逆傅立叶变换则将基的系数还原为函数。一个基础的科普可以参考此知乎链接,另外这个B站链接包含了以重心来思考的方法。傅立叶变换的过程类似于下图,是一个时域往频域转换的过程。
里面需要注意的有彼此正交的\(\{1,sin(x),cos(x),\cdots, sin(nx),cos(nx)\}\),正交函数的定义(相乘积分为0),欧拉定理(\(e^{ni}\)代表单位圆沿着逆时针走距离n)。傅立叶变换因为是按照顺时针运动因此多了一个负号,而积分内的\(f(x)\)可以理解为在单位圆上行走时振幅的改变量,积分并除以长度就能得到重心,傅立叶变换得到的\(\hat{f}(x)\)则没有除去长度,而是指向了重心方向的一个点。
傅立叶变换还有以下的一些性质
- \(\int (f(x))^2 dx = \int(\hat{f}(u))^2du\),这代表了时空域能量是一样的。
- \(\mathcal{F}{af}=a\mathcal{F}{f}\)
- \(\mathcal{F}{f(x/b)}\) = b\hat{f}(bx)$,代表时空域的拉伸效果也是一样的
- f的均值等于\(\hat{f}(0)\)
- 如果f是实函数,那么\(\hat{f}\)是一个偶函数(沿着y轴对称)。
3.2 傅立叶变换与卷积的联系
我们有\(\mathcal{F}{f\star g}=\hat{f}\hat{g}\)以及\(\hat{f}\star\hat{g}=\mathcal{F}{fg}\)。直观来讲就是时空域自己的卷积都等于对方的乘积。
3.3 过滤器的傅立叶变换
- Box, \(\methcal{F}{f_{box}}=\frac{sin(\pi u)}{\pi u}=sinc(\pi u)\)
- Tent, 两个box叠加所以是\(sinc^2(\pi u)\)
- B-splin,四个box叠加所以是\(sinc^4(\pi u)\)
- 正态分布为\(e^{-(2\piu)^2/2}\),需注意这里又变成了一个正态分布,只是标准差变成了\(1/2\pi\)。
具体情况可以见下图
3.4 狄拉克脉冲
我们可以把离散的采样点\(a\)看作在采样出发射了一个采样点值那么大的狄拉克脉冲,这个脉冲对点\(x\)的影响是\(f(a)\delta(x-a)\)。我们把离散的采样点看作很多个狄拉克脉冲后有以下的图像,称其为脉冲链。基于离散傅立叶变换我们可以知道如果输入的period为T的话,那么傅立叶变换后为1/T。因为狄拉克脉冲的脉冲链period为1,我们知道傅立叶变换后依然是一个狄拉克脉冲链。
3.5 采样和走样
在谈论二维图片的时空域的时候,可以参考此链接。总体来讲时域代表着颜色或者灰度等信息,频域则代表整体到细节,之前3blue1brown内用傅立叶变换画图也可以说明此点。另外值得注意的是频率上的0代表着所有地方的积分(\(e^0=1\)),往往较大。我们把离散的采样点考虑成时域\(f\cdot s_T\),则我们有其频域对应\(\hat{f}\star\hat{s_T}(u)=\hat{f}\star s_{1/T}=\sum_{i=-\infty}^{\infty} \hat{f}(u-\frac{i}{T})\)(应用之前的知识)。这个效果相当于把\(f\)的频域图每隔\(1/T\)叠加在一起,那么显然重合变高的地方生成了之前没有的事物,便造成了走样,这种走样是undersampling也就是采样点选少了导致的(T过大导致间隔太小,贴在一起了)。在进行重建过滤即在时域上\(s\star f\)的时候,我们知道其对应的频域为\(\hat{s}\cdot \hat{f}\)。因为box filter的傅立叶频域图较宽且正负浮动较大,相乘后如下图第三行所示在边缘处有了原函数没有的一些频率,造成了走样。
之前提到过,减少T或者增加采样频率可以让原频率图和复制图之间的距离足够大,让重叠部分可以被忽略。Nyquist–Shannon sampling theorem提到采样频率不低于两倍真实波形频率时才能在采样后正确重建,这个两倍的极限也被称为Nyquist极限。我们也可以通过增加lowpass或者高斯模糊过滤器来将频率图缩小在一个钟形线下,只需要控制标准差即可控制宽度,这样就可以抹去高频信息来避免走样。其他的过滤器,例如tent和B-spline也可以做到这一点,我们需要考虑走样与模糊之间的平衡(丢失高频减少走样但是也减少了细节)。实际运用的时候我们一般采取高斯模糊或者tent filter。