走样原理
走样
前面我们在光栅化算法的文章里提到,由于数学中的图像是连续的,但是计算机屏幕是由一个个像素组成的离散的画面,我们无法在计算机屏幕上画出完美的图像。 于是我们采用了一系列光栅化算法来拟合出近似的图形,但是这样画出的图形的边缘始终出现“锯齿”状,我们把这种现象称为“走样”。
比如这张图,我们可以很明显的看出左边的光栅化图像和右边的三角形具有明显的区别。
走样现象在生活中很常见,比如你用摄像机去拍摄显示器,会发现照片上出现一圈圈的摩尔纹,这也是走样导致的。
为了减少走样现象,我们需要先了解走样是为什么产生的,这样我们才能对症下药。
时域和频域
要明白走样现象的产生,我们需要先清楚时域和频域的概念。
简单来说,时域描述信号随时间的变化,频域描述信号中包含的不同频率成分。
通过傅里叶级数,我们可以知道,宇宙中的任何震动和信号,都可以被拆解成一堆简单正弦波(
下面这张图可以形象的展示傅里叶级数:
而通过傅里叶变换,我们可以实现任意信号由时域向频域的转换。
下面这张gif图可以让我们直观感受到傅里叶变换的作用:
傅里叶变换将函数的时域(红色)与频域(蓝色)相关联。频谱中的不同成分频率在频域中以峰值形式表示。
不只一维函数可以使用傅里叶变换,对于图片等也可以使用傅里叶变换:
如图,左边是一张黑白人像,右边是对图片进行傅里叶变换后得到的频谱图。
在图像的频谱图中:
中心位置(低频): 代表图像中变化平缓的大轮廓、大色块。图像的大部分能量都集中在这里。
四周边缘(高频): 代表图像中变化剧烈的细节、尖锐的边缘、噪点。
亮度和颜色: 某个位置越亮,说明图像中对应频率的成分越多。
下面我们对频谱图像进行高通和低通滤波,然后再做傅里叶逆变换,就可以更清晰的理解频谱图:
如上图,如果我们对频谱图进行高通滤波,即过滤掉低频信号,只允许高频信号通过,逆变换得到的人像只有人像边缘画面剧烈变换的部分的信号。
如上图,如果我们对频谱图进行低通滤波,即过滤掉高频信号,只允许低频信号通过,逆变换得到的人像有全部画面,但是变得非常模糊。
点乘与卷积
点乘
点乘就是对位相乘:两个函数在同一个位置上的值直接相乘,得到一个新的函数。
举个具体的例子,假设我们有一个一维信号
点乘就是对位相乘:
可以看到,乘 1 的位置原值保留,乘 0 的位置直接被清零——这就是采样的数学本质。
在时域上,点乘经常用于信号采样:
形象一点比喻,比如我们有一张连续的图像,点乘一个由无数个’孤立针尖’组成的采样网格(冲激阵列)。针尖所在的地方,乘以 1,原图颜色露出来;其余地方没有针尖,乘以 0,信息直接被抹杀。这一刀切下去,连续的现实世界就变成了离散的像素点。
在频域上,点乘经常用于滤波:
形象一点比喻,图像的频谱图摆在面前,我们拿一个圆形的数字面具扣上去:圆圈内部全打 1 分(保留),圆圈外部全打 0 分(舍弃)。由于图像的边缘、锯齿等细节都在外圈(高频),面具一扣,对位一乘,外圈的高频瞬间消失。整个过程不需要滑动,一瞬间就完成了频率的清洗。
卷积
公式看着复杂,但卷积的本质其实很简单:拿一个小模板(卷积核)在数据上滑动,每到一个位置就对覆盖区域做加权求和。
下面通过一个具体的 1D 例子,一步步感受卷积的计算过程。
假设我们有一个一维信号
卷积核
第 1 步(核的最右端对齐
第 2 步(核向右滑动一格):
第 3 步(核完全进入,覆盖三个元素):
第 4 步:
第 5 步:
最终结果:
对比原始信号
在时域(空间域)上,卷积经常用于图像模糊:
形象一点理解,我们拿一个
在频域上,卷积解释了采样为什么会导致频谱复制:
要理解这一点,需要先了解冲激函数(
换句话说,冲激函数就像一个”搬运工”——和它做卷积,会把原函数搬运到冲激所在的位置。
你可能会疑惑:前面点乘的例子中采样函数用的是
这两个其实并不矛盾——
宽度趋于零,面积又要保持为
1,高度自然趋于无穷大。可以这样想象:把一个宽度为
面积等于 1 才是关键所在,它赋予了
用
更重要的是,正是因为
而冲激阵列就是一系列等间距的
因此,用任意函数去卷积冲激阵列,就等于在每一个冲激位置各复制一份原函数,然后全部叠加:
举个简化的例子。假设原始频谱只有
1 | |
一目了然——原始频谱被完整地复制到了每个冲激所在的位置,形成周期性的频谱副本。
现在回到采样问题:当我们在时域对信号进行采样(即点乘冲激阵列)时,根据对偶性(时域点乘
这就是为什么采样会在频域产生一连串频谱副本——它不是巧合,而是冲激函数”复制粘贴”特性在频域的必然体现。
时域与频域的对偶性
最后,有一个非常重要的结论:
- 时域的点乘
频域的卷积 - 时域的卷积
频域的点乘
这两条对偶关系是信号处理的基石:在一个域里做乘法,等价于在另一个域里做卷积。
我们可以用一个表格来总结点乘和卷积在两个域中的作用:
| 操作 | 时域作用 | 频域作用 |
|---|---|---|
| 点乘 | 采样(离散化) | 滤波(去除频率成分) |
| 卷积 | 模糊(平滑化) | 频谱复制(周期性搬移) |
理解了这个对偶性,走样的逻辑链就完整了——时域采样(点乘冲激阵列)
这个结论的证明涉及傅里叶变换的性质,这里不再展开。
采样
经过了前面的铺垫,我们终于可以解释为什么会发生走样了。
如图,我们对一个函数图像,也就是信号进行采样,在时域平面上,这对函数图像点乘了一个冲激阵列,在频域平面上,这对函数图像进行了卷积。
最终,时域平面上我们得到了一些离散的点,而频域平面上,我们对频谱进行了复制。
但是,我们采样的频率变化会导致最终得到的图像的变化。
时域平面上,采样频率的变化很简单,会导致最后得到点的多少的变化,频率变高,采样点越密集;频率变低,采样点越稀疏。
在频域平面上,采样频率的变化会导致频谱副本的间距变化,时域采样频率越高,频域中的频谱副本间隔越大;采样频率越低,副本挤得越近,更容易重叠。
频谱重叠意味着多个频率成分落在了同一个位置,导致高频信息伪装成低频信息,从而无法正确恢复原始图像,这种现象就是走样(aliasing)。
现在,我们解释一下图像边缘锯齿产生的原因:
光滑的边缘属于高频变化,它包含大量高频。如果采样率不足,高频信息就会被错误的解释为低频信息,边缘就会被错误重建成锯齿状。
明白了走样的原理,我们就可以针对性的进行反走样了。
这次的插图来自画师 しまき
图片地址:https://www.pixiv.net/artworks/143547831