使用matlab对图像进行傅里叶变换

(0)

代码:

I=imread('1.jpg');

I=rgb2gray(I);

I=im2double(I);

F=fft2(I);

F=fftshift(F);

F=abs(F);

T=log(F+1);

figure;

imshow(T,[]);

傅里叶变换:

分析代码:

1. I=imread('1.jpg');

读取图像,不多说了

2. I=rgb2gray(I);

将图像转换为灰度图,如果没有这一步的话,最终得到的傅里叶变换是这个样子的

(2)

3. I=im2double(I);

将图像的数据格式转换为double型的,此时图像的数值范围由原来的[0,255],变成了[0,1],其实不进行转换的话,也可以进行傅里叶变换,只是傅里叶变换后的图像会有所不同,如(3)所示,可以跟图(1)比较一下看看效果,有时候不同的人得出的傅里叶变换结果不相同,也许就是这个原因

(3)

4. F=fft2(I);

进行傅里叶变换

5. F=fftshift(F);

对傅里叶变换后的图像进行象限转换,没有这一步的话,最终输出的结果是这样的

(4)

6. F=abs(F);

求傅里叶变换的模,我们都知道傅里叶变换后的结果为复数,包含real实部和imag虚部,而abs就是求复数的模,经过这一步,F的类型由复数的double变成了实数的double,如果没有这一步, matlab会给出提示,Warning: Displaying real part of complex input.最终输出的结果如下。

(5)

7. T=log(F+1);

经过前几步之后,我们得到了傅里叶变换的幅值,但是傅里叶变换后的数值范围非常大,maxF = 2.04e+05,minF = 0.009,如果不进行转换的话在图中显示就是图(6)的样子,中间有个小白点

(6)

那为什么要用log(F+1)呢。如图7所示,对(0,1)之间的x值,经过log(X)变换后会变成负数,而log(X+1)则将所有的x值,映射成正数,数值范围也更小一些。

(7)

8. figure;imshow(T,[]);

显示图像,之所以用imshow(T,[]);而不是imshow(T)。是因为即使经过对数变换后T的取值范围仍然大于[0,1],maxT=12.23,minT=0.009。imshow(T)只会显示[0,1]的值,而imshow(T,[]) 会根据灰度图的数值范围来显示图像,相当于将[0.09,12.23]映射到[0,1]显示。

MATLAB快速傅里叶变换(fft)函数详解

The 'i' in the 'Nth root of unity' 是虚数单位

​​1. Y = fft(y);

2. Y = fft(y,N);

式中,y是序列,Y是序列的快速傅里叶变换。y可以是一向量或矩阵,若y为向量,则Y是y的FFT,并且与y具有相同的长度。若y为一矩阵,则Y是对矩阵的每一列向量进行FFT。

根据采样定理,fft能分辨的最高频率为采样频率的一半(即Nyquist频率),函数fft返回值是以Nyqusit频率为轴对称的,Y的前一半与后一半是复数共轭关系。

作FFT分析时,幅值大小与输入点数有关,要得到真实的幅值大小,只要将变换后的结果乘以2除以N即可(但此时零频—直流分量—的幅值为实际值的2倍)。对此的解释是:Y除以N得到双边谱,再乘以2得到单边谱(零频在双边谱中本没有被一分为二,而转化为单边谱过程中所有幅值均乘以2,所以零频被放大了)。

​若分析数据时长为T,则分析结果的基频就是f0=1/T,分析结果的频率序列为[0:N-1]*f0

在调用格式2中,函数执行N点FFT。若y为向量且长度小于N,则函数将y补零至长度N,若向量y的长度大于N,则函数截断y使之长度为N。

使用N点FFT时,若N大于向量y的长度,将给频谱分析结果带来变化,应该特别注意。

将对N点FFT进行举例,说明当N大于向量y的长度时给频谱分析带来的变化。

上图中,左列为信号时域图形,右列为对应信号的频谱图。可以看出当N大于向量y的长度时,由于fft自动将100s后的信号值补零,原信号实际变为左下角的时域图形,所以频率发生了变化(增加多种频率的小振幅振动,主峰幅值被削弱)。

使用N点FFT时,不应使N大于y向量的长度,否则将导致频谱失真。

clear all %清除内存所有变量

close all %关闭所有打开的图形窗口

%% 执行FFT点数与原信号长度相等(100点)

% 构建原信号

N=100; % 信号长度(变量@@@@@@@)

Fs=1; % 采样频率

dt=1/Fs; % 采样间隔

t=[0:N-1]*dt; % 时间序列

xn=cos(2*pi*0.24*[0:99])+cos(2*pi*0.26*[0:99]);

xn=[xn,zeros(1,N-100)]; % 原始信号的值序列

subplot(3,2,1) % 变量@@@@@@@

plot(t,xn) % 绘出原始信号

xlabel('时间/s'),title('原始信号(向量长度为100)') % 变量@@@@@@@

% FFT分析

NN=N; % 执行100点FFT

XN=fft(xn,NN)/NN; % 共轭复数,具有对称性

f0=1/(dt*NN); % 基频

f=[0:ceil((NN-1)/2)]*f0; % 频率序列

A=abs(XN); % 幅值序列

subplot(3,2,2),stem(f,2*A(1:ceil((NN-1)/2)+1)),xlabel('频率/Hz') % 绘制频谱(变量@@@@@@@)

axis([0 0.5 0 1.2]) % 调整坐标范围

title('执行点数等于信号长度(单边谱100执行点)'); % 变量@@@@@@@

%% 执行FFT点数大于原信号长度

% 构建原信号

N=100; % 信号长度(变量@@@@@@@)

Fs=1; % 采样频率

dt=1/Fs; % 采样间隔

t=[0:N-1]*dt; % 时间序列

xn=cos(2*pi*0.24*[0:99])+cos(2*pi*0.26*[0:99]);

xn=[xn,zeros(1,N-100)]; % 原始信号的值序列

subplot(3,2,3) % 变量@@@@@@@

plot(t,xn) % 绘出原始信号

xlabel('时间/s'),title('原始信号(向量长度为100)') % 变量@@@@@@@

% FFT分析

NN=120; % 执行120点FFT(变量@@@@@@@)

XN=fft(xn,NN)/NN; % 共轭复数,具有对称性

f0=1/(dt*NN); % 基频

f=[0:ceil((NN-1)/2)]*f0; % 频率序列

A=abs(XN); % 幅值序列

subplot(3,2,4),stem(f,2*A(1:ceil((NN-1)/2)+1)),xlabel('频率/Hz') % 绘制频谱(变量@@@@@@@)

axis([0 0.5 0 1.2]) % 调整坐标范围

title('执行点数大于信号长度(单边谱120执行点)'); % 变量@@@@@@@

%% 执行FFT点数与原信号长度相等(120点)

% 构建原信号

N=120; % 信号长度(变量@@@@@@@)

Fs=1; % 采样频率

dt=1/Fs; % 采样间隔

t=[0:N-1]*dt; % 时间序列

xn=cos(2*pi*0.24*[0:99])+cos(2*pi*0.26*[0:99]);

xn=[xn,zeros(1,N-100)]; % 原始信号的值序列

subplot(3,2,5) % 变量@@@@@@@

plot(t,xn) % 绘出原始信号

xlabel('时间/s'),title('原始信号(向量长度为120)') % 变量@@@@@@@

% FFT分析

NN=120; % 执行120点FFT(变量@@@@@@@)

XN=fft(xn,NN)/NN; % 共轭复数,具有对称性

f0=1/(dt*NN); % 基频

f=[0:ceil((NN-1)/2)]*f0; % 频率序列

A=abs(XN); % 幅值序列

subplot(3,2,6),stem(f,2*A(1:ceil((NN-1)/2)+1)),xlabel('频率/Hz') % 绘制频谱(变量@@@@@@@)

axis([0 0.5 0 1.2]) % 调整坐标范围

title('执行点数等于信号长度(单边谱120执行点)'); % 变量@@@@@@@

关键词: 用matlab做傅里叶变换方法 matlab的傅里叶变换原理 傅里叶变换 傅里叶变换原理