傅里叶变换
Fourier transform
1 傅里叶变化基本知识
1.1 一维连续Fourier变换
对函数f(x)
进行傅里叶变换得到F(u)
逆变换:从F(u)
到f(x)
进行反傅里叶变换
一维连续函数f(x)
的傅立叶变换F(u)
一般是虚数,可用复数形式表示为:
定义幅值
为:
定义相位
为:
用幅值
和相位
表示傅立叶变换
能量谱
(或功率谱)
现在可以来复习一下傅里叶变换
hui gu yi xia:
当然了,在信号与系统里面学到的最有用的应该就是sampling
采样了,在离散傅里叶变换里面真的太重要了:对于连续函数,就假如说是三角函数sin(x)
,当以∆?
时间(∆?
越小越好)为间隔采样该函数,会得到sin(x)
的一堆离散值,对该系列离散值做傅里叶变换,在频域上采样后的频谱相当于原函数频谱的频移,最后用滤波器滤掉就可以得到连续函数的频谱,在通过反傅里叶变换得到原连续函数。
1.2 一维离散Fourier变换
正变换:(DFT)
逆变换:(IDFT)
变换示意图如下:
将频率部分取出:
1.3 二维连续Fourier变换
正变换:
逆变换:
1.4 二维离散Fourier变换
正变换:
逆变换:
幅度 (频谱):
相位角/谱:
功率谱/能量谱
2 MATLAB示例
2.1 正变换和反变换
clc, close all;
I = imread('saturn.png');
J = rgb2gray(I);
K = fft2(J);
L = fftshift(K);
M = ifft2(K);
% M = ifft2(ifftshift(L)); % 这样也是可以的
figure,
subplot(121),imshow(uint8(abs(L/198))),title('傅里叶频谱');
subplot(122),imshow(uint8(uint8(M))),title('傅里叶反变换后的图像');
clc, close all;
I = imread('saturn.png');
J = rgb2gray(I);
K = fft2(J);
L = fftshift(K);
M = ifft2(K);
% M = ifft2(ifftshift(L)); % 这样也是可以的
figure,
subplot(121),imshow(uint8(abs(L/198))),title('傅里叶频谱');
subplot(122),imshow(uint8(uint8(M))),title('傅里叶反变换后的图像');
RESULT:
2.2 傅里叶变换的幅度谱和相位谱
clc,close all;
I = imread('pout.tif');% MATLAB库里面有图源
% size(I)
% J = rgb2gray(I);
K = fft2(I);
L = fftshift(K);
fftr = real(L);
ffti = imag(L);
A = sqrt(fftr.^2 + ffti.^2);
A = (A - min(min(A)))/(max(max(A))-min(min(A)))*255;
B = angle(K);
figure,subplot(131),imshow(I),title('原图');
subplot(132),imshow(A),title('傅里叶幅度值');
subplot(133),imshow(B),title('傅里叶相位值');
clc,close all;
I = imread('pout.tif');% MATLAB库里面有图源
% size(I)
% J = rgb2gray(I);
K = fft2(I);
L = fftshift(K);
fftr = real(L);
ffti = imag(L);
A = sqrt(fftr.^2 + ffti.^2);
A = (A - min(min(A)))/(max(max(A))-min(min(A)))*255;
B = angle(K);
figure,subplot(131),imshow(I),title('原图');
subplot(132),imshow(A),title('傅里叶幅度值');
subplot(133),imshow(B),title('傅里叶相位值');
RESULT:
2.3 傅里叶变换性质:平移性质
空域坐标移动,频域只发生相位变化,幅值不变。同时频域坐标移动,空域中只发生相变,幅值不变。
clc,close all;
I1 = zeros(256,256); % 产生一个全零256×256矩阵(全为黑色)
I1(12:20,12:48) = 1; % 随便找个位置产生一个8×36的全1方块
I2 = zeros(256,256); % 产生一个全零256×256矩阵(全为黑色)
I2(210:218,100:136) = 1; % 实现空域平移功能
figure,
subplot(231),imshow(I1),xlabel('(a) 原始图像')
subplot(234),imshow(I2),xlabel('(b) 空域平移后图像')
I1 = im2double(I1); % FFT要求输入的矩阵为双精度浮点型,进行数据类型变换
F1 = fftshift(fft2(I1)); % 进行二维傅里叶变换
I2 = im2double(I2); % FFT要求输入的矩阵为双精度浮点型,进行数据类型变换
F2 = fftshift(fft2(I2)); % 进行二维傅里叶变换
subplot(232),imshow(log(1+abs(F1)),[]);xlabel('(c) 原始图像对应的傅里叶变化幅值'); % 使用log是便于展示
subplot(235),imshow(log(1+abs(F2)),[]);xlabel('(d) 空域平移后对应的傅里叶变化幅值') % 使用log是便于展示
subplot(233),imshow(angle(fft2(I1)),[]);xlabel('(e) 原始图像对应的傅里叶变化相位')
subplot(236),imshow(angle(fft2(I2)),[]);xlabel('(f) 空域平移后对应的傅里叶变化相位')
clc,close all;
I1 = zeros(256,256); % 产生一个全零256×256矩阵(全为黑色)
I1(12:20,12:48) = 1; % 随便找个位置产生一个8×36的全1方块
I2 = zeros(256,256); % 产生一个全零256×256矩阵(全为黑色)
I2(210:218,100:136) = 1; % 实现空域平移功能
figure,
subplot(231),imshow(I1),xlabel('(a) 原始图像')
subplot(234),imshow(I2),xlabel('(b) 空域平移后图像')
I1 = im2double(I1); % FFT要求输入的矩阵为双精度浮点型,进行数据类型变换
F1 = fftshift(fft2(I1)); % 进行二维傅里叶变换
I2 = im2double(I2); % FFT要求输入的矩阵为双精度浮点型,进行数据类型变换
F2 = fftshift(fft2(I2)); % 进行二维傅里叶变换
subplot(232),imshow(log(1+abs(F1)),[]);xlabel('(c) 原始图像对应的傅里叶变化幅值'); % 使用log是便于展示
subplot(235),imshow(log(1+abs(F2)),[]);xlabel('(d) 空域平移后对应的傅里叶变化幅值') % 使用log是便于展示
subplot(233),imshow(angle(fft2(I1)),[]);xlabel('(e) 原始图像对应的傅里叶变化相位')
subplot(236),imshow(angle(fft2(I2)),[]);xlabel('(f) 空域平移后对应的傅里叶变化相位')
RESULT:
2.4 傅里叶变换性质:旋转不变性
如果图像本身在空间域上旋转,则其二维离散傅里叶变换在频率域上也会旋转,而且旋转的角度相同。
clc,close all;
I1 = zeros(256,256); % 产生一个全零256×256矩阵(全为黑色)
I1(124:132,120:156) = 1; % 随便找个位置产生一个8×36的全1方块
subplot(221),imshow(I1),xlabel('(a) 原始图像');
subplot(222),imshow(log(1+abs(fftshift(fft2(im2double(I1))))),[]),xlabel('(b) 傅里叶变换');
I2 = imrotate(I1,-45,'bilinear','crop'); % 以图像中心为原点旋转45°
subplot(223),imshow(I2),xlabel('(c) 旋转后的图像');
subplot(224),imshow(log(1+abs(fftshift(fft2(im2double(I2))))),[]),xlabel('(d) 旋转后图像对应傅里叶变换');
clc,close all;
I1 = zeros(256,256); % 产生一个全零256×256矩阵(全为黑色)
I1(124:132,120:156) = 1; % 随便找个位置产生一个8×36的全1方块
subplot(221),imshow(I1),xlabel('(a) 原始图像');
subplot(222),imshow(log(1+abs(fftshift(fft2(im2double(I1))))),[]),xlabel('(b) 傅里叶变换');
I2 = imrotate(I1,-45,'bilinear','crop'); % 以图像中心为原点旋转45°
subplot(223),imshow(I2),xlabel('(c) 旋转后的图像');
subplot(224),imshow(log(1+abs(fftshift(fft2(im2double(I2))))),[]),xlabel('(d) 旋转后图像对应傅里叶变换');
RESULT:
2.5 傅里叶变换性质:比例性
比例发生变化,不会影响频谱分布规律。
clc,close all;
I1 = zeros(255,255); % 产生一个全零256×256矩阵(全为黑色)
I1(125:132,125:132) = 1; % 随便找个位置产生一个7×7的全1方块
subplot(221),imshow(I1),xlabel('(a) 原始图像');
subplot(222),imshow(log(1+abs(fftshift(fft2(im2double(I1))))),[]),xlabel('(b) 傅里叶变换');
I2 = zeros(255,255); % 产生一个全零256×256矩阵(全为黑色)
I2(110:147,110:147) = 1; % 随便找个位置产生一个37×37的全1方块
subplot(223),imshow(I2),xlabel('(c) 旋转后的图像');
subplot(224),imshow(log(1+abs(fftshift(fft2(im2double(I2))))),[]),xlabel('(d) 放大后图像对应傅里叶变换');
clc,close all;
I1 = zeros(255,255); % 产生一个全零256×256矩阵(全为黑色)
I1(125:132,125:132) = 1; % 随便找个位置产生一个7×7的全1方块
subplot(221),imshow(I1),xlabel('(a) 原始图像');
subplot(222),imshow(log(1+abs(fftshift(fft2(im2double(I1))))),[]),xlabel('(b) 傅里叶变换');
I2 = zeros(255,255); % 产生一个全零256×256矩阵(全为黑色)
I2(110:147,110:147) = 1; % 随便找个位置产生一个37×37的全1方块
subplot(223),imshow(I2),xlabel('(c) 旋转后的图像');
subplot(224),imshow(log(1+abs(fftshift(fft2(im2double(I2))))),[]),xlabel('(d) 放大后图像对应傅里叶变换');
RESULT:
2.6 傅里叶变换性质:周期性和共轭对称性
2.7 傅里叶变换性质:统计特性(平均值)
2.8 傅里叶变换性质:可分离性
固定y方向,x方向每一行进行一维DFT;固定x方向,y方向每一列进行一维DFT。
即: 一个2D-DFT可用二次1D-DFT来实现。(上面的公式可以左右移动)
2.9 傅里叶变换性质:卷积/相关性
即: 空间域的卷积运算对应频率域的乘积运算;频率域的卷积运算对应空间域的乘积运算。