Java 实现快速傅里叶逆变换 求傅里叶逆变换的例子_Java 实现快速傅里叶逆变换

傅里叶变换

Fourier transform



Java 实现快速傅里叶逆变换 求傅里叶逆变换的例子_matlab自带的傅里叶反变换函数_02

Java 实现快速傅里叶逆变换 求傅里叶逆变换的例子_matlab自带的傅里叶反变换函数_03

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)

变换示意图如下:

Java 实现快速傅里叶逆变换 求傅里叶逆变换的例子_matlab对图像进行傅里叶变换_04

将频率部分取出:

Java 实现快速傅里叶逆变换 求傅里叶逆变换的例子_matlab 通过矩阵变换使图像旋转平移_05

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:

Java 实现快速傅里叶逆变换 求傅里叶逆变换的例子_matlab 通过矩阵变换使图像旋转平移_06

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:

Java 实现快速傅里叶逆变换 求傅里叶逆变换的例子_Java 实现快速傅里叶逆变换_07

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:

Java 实现快速傅里叶逆变换 求傅里叶逆变换的例子_Java 实现快速傅里叶逆变换_08

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:

Java 实现快速傅里叶逆变换 求傅里叶逆变换的例子_matlab对图像进行傅里叶变换_09

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:

Java 实现快速傅里叶逆变换 求傅里叶逆变换的例子_matlab 通过矩阵变换使图像旋转平移_10

2.6 傅里叶变换性质:周期性和共轭对称性

2.7 傅里叶变换性质:统计特性(平均值)



Java 实现快速傅里叶逆变换 求傅里叶逆变换的例子_matlab对图像进行傅里叶变换_11

2.8 傅里叶变换性质:可分离性

固定y方向,x方向每一行进行一维DFT;固定x方向,y方向每一列进行一维DFT。

即: 一个2D-DFT可用二次1D-DFT来实现。(上面的公式可以左右移动)

2.9 傅里叶变换性质:卷积/相关性

即: 空间域的卷积运算对应频率域的乘积运算;频率域的卷积运算对应空间域的乘积运算。