计算机图形学中不可避免的会涉及到图像分析与处理的相关知识,前些时间也重温了下经常使用到的採样、重建以及纹理贴图等内容,并对当中的走样与反走样有了很多其它的认识,这里小结一下。
1. 基本问题
信号的採样与重建过程中首先面临着两个主要的问题:- 给定一个连续的信号g(x)以及它的离散採样信号gs(x),是否能通过gs(x)来完整的描写叙述g(x) 的信息;
- 假设能够,怎样通过gs(x)来重建出原始信号g(x)。
2. 採样
将一处于空间域(或时域)内的信号向频域进行转换,能够使用傅立叶变换(Fourier Transformation)来实现。给定空间域信号为g(x),其相应的频域信号为G(f),则其相应的傅立叶变换关系为:
当中的x 表示相应的空间位置,f 表示相应的频率。原始信号g(x)相应的频域空间中的函数G(f)(可能)例如以下图所看到的:
频域G(f)
图中的横轴f 表示相应的频率,越往两端相应的频率越大。当中能够看出,G(f) 的有效值主要限定于频率|fmax|之内,其余频率位置上均为0,对于这种情况能够称G(f)是带限(bandlimited)于fmax 的。这是信号採样与重建中一个较为重要的属性。
对原始信号g(x)进行採样得到离散採样信号gs(x),採样的过程主要是通过一个基于脉冲函数的脉冲採样器来实现,其表述例如以下所看到的:
当中的Ts就是採样周期。在s(x) 下就能够得到原始信号与採样信号之间的关系:
为了更方便的观察gs(x)的一些属性,能够将其转换到频域空间内进行分析,这里能够借助傅立叶变换中的几个重要属性:
- 函数在空间域(或时域)内的乘积相应于它们在频域空间内的卷积:
- 累积脉冲函数的傅立叶变换的特殊形式(证明可见这里):
利用这些属性就能够推导gs(x)的频域函数Gs(f) 例如以下:
从推导结果的表达式中能够看出:Gs(f)中包括了完整的原始信号G(f) 的信息;Gs(f)的值相对于原始G(f) 有作相应比例的缩放;另外,其以fs 为周期对G(f) 进行了全频空间上的叠加。终于,Gs(f) 相应的频域空间函数波形例如以下图所看到的:
3. 重建
通过上述对Gs(f) 的频域分析后发现,能够用第二种形式来表述G(f)与Gs(f) 之间的关系:
当中的Ghigh(f) 表示在|fmax|之外的较高频率上对G(f)进行叠加的部分。如此一来,通过使用某种手段去除当中的超过频率|fmax|的叠加部分之后就能够从Gs(f)实现对原始信号的还原,即重建。
可是在某些情况下,并不能从Gs(f)中完整地分离出G(f)与Ghigh(f)部分,这种话就无法滤去当中的高频部分得到原始信号,因而能够实现重建的信号採样须要满足下述条件才可:
- 原始信号必须是带限的。通过Gs(f)的频域函数图能够看出,假设原始信号不是带限的(即G(f)向两端无限扩展),则必定会出现G(f)和\Ghigh(f)两个波谱之间的相互交叠;这样就无法完整还原出原始信号。
- 採样频率必须是原始信号最大频率fmax 的2倍(Nyquist rate)。相同通过Gs(f) 的频域函数图能够看出,假设採样频率fs 过低,也会造成两側的Ghigh(f)与G(f)的交叠,进而导致无法还原。
3.1 理想频域滤波函数
假设有了满足重建条件的採样信号,也即上述分离表达式可行时,怎样从中分离出目标G(f)即成为一个比較简单的问题。仅仅须要依据\(f_{max}\)的分布,构造一个频域中形例如以下式的函数,并将其施加于Gs(f) 就可以:
这里的\(H(f)\)被称理想低通滤波器(Ideal Low-pass Filter),由于它能够完整地从Gs(f) 中分离出G(f)部分而不会带来噪声或信号的损失。将H(f) 施加到Gs(f) 上的情形例如以下图所看到的(表现为频域空间中两个函数的乘积):
频域中通过向Gs(f) 施加H(f) 来滤出当中的G(f) 部分
3.2 理想空间域滤波函数
将上述频域中的理想低通滤波函数向空间域进行傅立叶逆变换就可以得到相应的空间域理想滤波函数,该函数也被称为sinc函数,其形式例如以下:
空间域中的sinc函数例如以下图所看到的:
Sinc函数
利用滤波函数进行频域和空间域的重建操作例如以下所看到的:
从上述关于g(x) 的表达式中能够看出,使用sinc函数来重建g(x) 时须要计算当前採样点周围无限多个相邻採样点的累积,这样的计算在实际应用中当然是不可行的。因而这里的理想滤波函数sinc就不能被直接应用,这于是就引出了非理想滤波函数。
3.3 非理想滤波函数下的重建
非理想的滤波函数并不能像sinc函数那样全然滤去Gs(f) 中的高频Ghigh(f) 部分,而是一定程度上有所保留;同一时候,也不能全然保留当中的目标低频G(f) 部分,而是一定程度上有所损失。但总体上,非理想的滤波函数能够以一种可行的方案来实现对原始信号在可接受程度上的重建。频域上的一个非理想滤波函可能例如以下图所看到的:
当中的Hr(f)即为非理想的频域滤波函数:其在|fmax|内部的部分并不能全然地还原出G(f),而是在接近|fmax|处有所损失(曲线向下导致);同一时候,在到达|fmax|后并没有截止而是继续向外扩展,这样就在结果中引入了频率超过|fmax|的高频部分。
在空间域上,使用非理想的滤波函数来实现重建则是通过在目标点周围施加一个一定尺寸(维度不一定)的Kernel并累积当中的有限採样点(对照sinc中的无限)来完毕。其形式一般例如以下所看到的:
上式就表示在目标点x 周围通过K个採样点、在重建核心h(x)下(具现为权重)实现对当前点的信号估值。
4. 重建Kernel
由上述对于空间域内重建函数的分析能够看出,在经由採样点对信号进行重建的过程中,重建核心的设计至关重要。在实践中常常使用的重建核心主要有下面几种:4.1 Box Filter
该滤波器的函数形式例如以下所述:
这是最简单的一种Filter,其相应的空间域及频域函数波形图例如以下:
Box Filter
将其应用到重建函数中能够看出:其对于目标点的估值仅仅会使用若干採样点中的一个,而并没有採用多个採样点之间的插值,因而重建效果较差,终于会得到例如以下图所看到的的阶梯状波形(称之为锯齿边缘或Jagged Edges)。
4.2 Triangle Filter
该滤波器的函数形式例如以下所述:
其也被称为Tent Filter,其相应的空间域及频域函数波形图例如以下:
Triangle Filter
相对来说,其重建效果会比Box Filter要好(例如以下图所看到的),但当中的锯齿边缘依旧明显,这主要是因为该Filter对採样点之间的插值力度仍然不够所致。相应的H(f)对超过fmax的高频部分抑制力度不够所致。
4.3 Cubic Convolution
该滤波器是以一种三阶多项式的方法来对sinc函数进行近似,效果蛮不错,并且还能够暴露出參数以供效果调节。其形式例如以下:
Cubic Filter
Cubic滤波器重建效果
从图中能够看出,相对于前两种滤波器,使用Cubic滤波器能够明显地降低重建信号中的锯齿规模与数量,这主要是因为其对採样点之间採用了更高阶的插值计算,因而效果相对更好。
4.4 Windowed Sinc Function
这里回过头来再看理想的空间域sinc滤波函数,其最重要的应用障碍就是当中对无限多相邻採样点的累积,反映在空间域sinc函数上则是曲线向横轴两側的无限延伸;因而,假设能够去掉其在空间域中向两側的延伸部分(相当于对sinc函数进行滤波,过滤当中空间位置较大的部分),则其近似的sinc函数就变得应用可行。该方法与频域空间中的滤波(施加H(f) 的影响)类似,仅仅只是这里是在空间域上对sinc函数施加一个窗体过滤操作,终于仅仅使用窗体内(含有限个採样点)的修正sinc函数。
常见的几种空间域sinc窗体函数例如以下:
4.4.1 Hann Hamming
该窗体函数形式例如以下所述:
当中的N用来控制窗体中採样点的数量,a 用来控制窗体函数曲线的外形。相应的函数形状例如以下:
Hann&Hamming窗体函数
从能够看出,终于得到的H(f)函数质量比前述几种非sinc窗体类型的要更好。
4.4.2 Blackman
该窗体函数形式例如以下所述:
当中的N相同为窗体中的採样点数量,仅仅只是这里相对于H&H少了一个可控的參数。相应的函数形状例如以下:
Blackman窗体函数
4.4.3 Lanczos
该窗体函数形式例如以下所述:
当中的n用来控制窗体过滤域的范围。相应的函数形状例如以下(当中的n = 2):
Lanczos窗体函数
在应用中,将这些窗体函数施加于sinc函数上,就可以得到近似于sinc函数效果的窗体滤波函数,进而实现更好的图像信号重建。
5. 走样与反走样
5.1 走样原因
在前面介绍了使用採样信号来全然重建原始信号所需的两个基本条件:1. 原始信号是带限的;2. 採样频率要满足Nyquist频率。假设这两个条件中有任一条不被满足则即便是使用理想的低通 滤波器也不可能全然重建出原始信号,这样的情况下的现象就称为走样(Aliasing)。
对于图形学中的图像渲染而言,Nyquist率是由可像素化显示的最高频率决定,也即为2 pixels / cycle(两个像素间有一个非像素间隔),相应的频率则为0.5,因而fmax=1,这也就相应:无走样渲染时的採样最低频率不应该小于1。一个明显的样例就是后处理中常见的案例:将一个N X N大小的缓冲区纹理贴到一个屏幕空间中N X N的Quad上渲染时并不会有走样,由于其採样频率满足Nyquist要求。
另外,也要区分走样与锯齿之间的差异,两者在图形学中易被混淆(这主要是因为图像渲染时的走样也经常具化为锯齿现象)。锯齿主要是因为重建Kernel不够好,进而使得在重建信号中出现了插值不平滑的情况,可是假设在其採样信号上施加一个理想的重建Kernel时则还是能够全然地还原出原始信号(比方纹理贴图中的Magnification);反之,走样则是因为不满足信号重建的两个基本条件,这样即使在其採样信号上使用理想的重建Kernel也不能够重建出原始信号。通过当中的差异能够看出:锯齿现象能够通过一些Blur算法来加以消除,但走样却不行。
5.2 反走样方法
当採样不满足上述重建的基本条件时就会产生走样,而针对走样产生的原因,通过各种方法与途径来消除走样的产生即是反走样。通常来说,一般的图像信号均是带限的,可是其却可能限制于一个较大的fmax,进而导致第二个条件难以达到,因而两个条件是相关的。依据走样的来源,就能够有两种方法来实现反走样:
- 在原始信号的带限上做处理。该方法主要是在採样前对信号进行一些预滤波(Prefiltering)处理来改动原始信号的带限,比方相同使用一个低通滤波器来将原始信号的带限降到一个更低的范围,这种话就能够使重建的第二个条件更easy满足。
- 在採样频率上做处理。该方法就是直接增大採样的频率来使其尽可能地满足第二个重建条件。
当中另外一种方法尽管比較直接,但其应用场合却有所限制,比方向一个屏幕固定像素数量的区域渲染图像时无法增大其相应的採样频率,这时就仅仅能使用Prefiltering的方法来实现反走样。这里须要注意Prefiltering的操作是在採样之前进行的。
5.3 Prefiltering方法的几个应用
5.3.1 Edge Antialiasing
基于Prefiltering方法的边缘反走样主要是利用Area sampling的手段来实现。该方法将目标输出像素与原始图像信号中的一个子区域相应,能够称此区域为preimage。然后用一个低通滤波器来对该子区域进行滤波,例如以下所看到的:
这样就能够总体减少图像数据源的带限,进而达到反走样的目的。基于此方法的应用有非常多,比方像Supersampling, Multisampling等。首先,经过GPU硬件管线渲染后得到一个比屏幕分辨率大的颜色缓冲区,然后将目标输出点与颜色缓冲区中的一个子区域相应(子区域中的像素分布可能并非规则的),例如以下图所看到的。然后对该子区域中的像素做低通滤波操作来减少缓冲区图像信号的带限,之后将结果输出到屏幕像素中就可以实现反走样。
5.3.2 Texture Antialiasing
纹理贴图中的走样主要产生在Minification时(如前所述的像素採样频率不足),针对这样的走样最经常使用的操作也是Prefiltering方法,典型应用就是Mipmap。Mipmap方法是在纹理贴图生成时,计算出个几不同Level的子贴图,比方第0级相应N X N大小,第1级相应N/2 X N/2大小,等等;当前级中的像素由上一级相关位置上的四个像素来决定。这样,每一个Level的子贴图也就相应着不同的带限,在实际使用时通过Level选择算法定位到合适的贴图级别,使得贴图渲染时的採样频率满足Nyquist条件,进而达到反走样的目的。
Mipmap
使用Mipmap须要预先生成原始贴图在若干级别下的子贴图,因而会带来一定的额外空间占用量(大约33%);同一时候,在使用时须要定位到合适的贴图级别,这个计算过程也会比較复杂(也值得好好研究,只是还好,能够有API或硬件帮助完毕)。总体上来说,Mipmap方法以一种较经济的Prefiltering手段攻克了纹理贴图中的走样现象,且效果较好。