目录
一、DFT原理及其Matlab实现
(一)1D-DFT
先来看看1D-DFT,假如我们有长度为N的信号,对其做DFT,得到
将DFT的实部和虚部拆出来:
当是实函数时,DFT的实部是偶函数,虚部是奇函数。
当是实偶函数时,DFT的虚部就变成0了,结合图1进行理解。
图1
所以,当时域信号是实偶信号时,我们就可以把DFT写成:
其中,
对于信号值全为正数的信号,其DFT在低频时能量最高,这里的能量并非物理意义上的能量,可以理解为某个频域处的信号对原始信号贡献的信息量最大。同时,显而易见,一维信号的N个频点上近似包含两个低频点,分别为k=0和k=N-1,包含一个高频点,对应k=N/2。
(二)2D-DFT
这里要提醒大家的是MN项可以放在DFT正变换的前面,也可以放在DFT逆变换的前面,但是为了与Matlab中的实现形式一致,我们将该项放置在逆变换公司前面。而且matlab中的数组索引是以1开始,MATLAB中的F(1,1)和f(1,1)就对应正变换和逆变换中的数学量F(0,0)和f(0,0)。
DFT在u方向和v方向上都是周期无穷的,周期由M和N决定。周期性也是DFT逆变换的一个重要属性,傅里叶逆变换得到的图像也是周期无穷的。
(三)1D-DFT和2D-DFT的频谱特点以及中心化思想
1. 1D-DFT的频谱特点
在数学域,[-Π,Π]表示一个完整的周期,但是在计算机中,[0,2Π]表示一个完整的周期,因为DFT本身的周期性,我们在[0,2Π]上真能观察到两个紧邻的半周期,无法观察到一个完整的周期,如果我们想在[0,2Π]看见完整且正确排序的周期,就需要对信号进行高低频转换,即令:,然后对
做DFT变换,转换前后频域变化的示意图如下:
2. 2D-DFT的频谱特点
与1D-DFT同理,2D-DFT频谱图中就是四个紧邻的没有按顺序排列的四分之一周期,为了简化频谱的视觉分析,我们在2D-DFT之前将乘以
。
更直观的理解在这里,将1,3象限对调,2,4象限对调,就可以在得到一个完整且按顺序排列的频谱图。前面说过,1D-DFT有两个低频点(两端),那么对应到二维DFT就会产生四个低频点(四个角点),如图2左图,为了将低频信息集中在一起来观察,对DFT做中心化后就得到了图2右图所示的频谱图。
图2 2D-DFT中心换前后对比
下面用真实的图片的DFT变换来说明频率中心化操作的影响,这里的DFT是没有做频率中心化的,可以看出,频谱图的四个角都有亮点,在u,v两个维度都错位半个周期频谱图亮点集中了。
图3 未中心化的2D-DFT
对DFT变化做中心化,频谱图如下图:
图4 中心化后的2D-DCT
3. 在matlab中计算并可视化二维DFT
实际应用中,DFT及其逆变换可以通过使用FFT算法来实现,而且我们对图像做DFT,一般都是对灰度图做FFT变换,如果是彩图,需要将图像先转化为灰度图,再做FFT变换。
clc;
close all;
RGB=imread('图片路径');
I = rgb2gray(RGB);
F = fft2(I) % fft2()工具用来实现FFT变换
S = abs(F) % 使用函数abs()计算傅里叶频谱(模值)
imshow(S, [])
Fc = fftshift(F); % 频率中心化
% 举个简单的例子说明fftshift函数的作用
% a = [1 2; 3 4] 则 fftshift(a) = [4 3; 2 1]
% 对应的,去中心化
% F = ifftshift(Fc);
S2 = log(1+abs(Fc)); % 限制傅里叶系数的范围
imshow(S2, [])
二、DCT变换
1. 1D-DCT
DCT变换,DCT其实就是输入信号是实偶函数的DFT,现实应用中,没有那么多现成的实偶信号,而DCT的巧妙之处就是先将任何一个输入信号延拓为一个实偶信号,再做DFT变换,对一个长度为N的信号(信号在[0,N-1]上取值),将原信号关于N-1/2对称,以2N为周期将其周期延拓:
对2N个点的离散序列作DFT,有
与DFT相比,1D-DCT的低频点只有一个,就是当k=0的时候,在计算机中做DCT变换的时候, 为了保证变换基的规范正交性,引入常量:
2. 2D-DCT
因为一个周期内的1D-DCT只有一个低频点,一个周期内的2D-DCT也只有一个低频点。具体理解见下图:
图5 2D-DCT的能量集中在左上角
三、DCT的优点
DCT继承了DFT的可分离特性,即在做2D-DCT的时候,可以分解为一个沿行和一个沿列的1D-DCT来实现,相比于DFT,DCT有更好的能量压缩特性,因为它是对信号先镜像,然后DFT,使得二维图像的频谱图中只有左上角一个低频点,即图像中的重要信息全集中在左上角。