图像的傅立叶变换,原始图像由N 行N 列构成,N 必须是基2 的,把这个N*N 个包含图像的点称为实部,另外还需要N*N 个点称为虚部,因为FFT是基于复数的,如下图所示: (//实数DFT将时域内的N 个点变换为频域中两组各N/2+1 个点(分别对应实部和虚部)) 计算图像傅立叶变换的过程很简单:首先对每一行做一维FFT,然后对每一列做一维FFT
具体来说,先对第 0 行的N 个点做FFT(实部有值,虚部为0),将FFT输出的实部放回原来第 0 行的实部,FFT输出的虚部放回第 0 行的虚部,这样计算完全部行之后,图像的实部和虚部包含的是中间数据,然后用相同的办法进行列方向上的FFT变换,这样 N*N的图像经过FFT得到一个N*N 的频谱
下面展示了一副图像的二维FFT 变换: 频域中可以包含负值,图像中灰色表示0,黑色表示负值,白色表示正值
可以看到 4个角上的黑色更黑,白色更白,表示其幅度更大,其实 4 个角上的系数表示的是图像的低频组成部分,而中心则是图像的高频组成部分
除此以外,FFT 的系数显得杂乱无章,基本看不出什么
将上述直角坐标转换为极坐标的形式,稍微比较容易理解一点,幅度中4 个角上白色的区域表示幅度较大,而相位中高频和低频基本看不出什么区别来
上述以一种不同的方法展示了图像频谱,它将低频部分平移到了频谱的中心(//MATLAB 中实现函数 fftshift)
这个其实很好理解,因为经 2D-FFT 的信号是离散图像,其 2D-FFT 的输出就是周期信号,也就是将前面一张图周期性平铺,取了一张以低频为中心的图
将原点放在中心有很多好处,比如更加直观更符合周期性的原理,但在这节中还是以未平移之前的图来解释
行 N/2 和列 N/2 将频域分成四块
对实部和幅度来说,右上角和左下角成镜像关系,左上角和右下角也是镜像关系;对虚部和相位来说,也是类似的,