Matlab对图像进行傅里叶变换实例

一、实验目的

1、了解图像变换的意义和手段;
2、熟悉傅里叶变换的基本性质;
3、熟练掌握FFT的方法与应用;
4、通过实验了解二维频谱的分布特点;
5、通过本实验掌握利用MATLAB编程,实现数字图像的傅里叶变换。

二、实验仪器

1、计算机;
2、MATLAB程序;
3、移动式存储器(软盘、U盘等);
4、记录用的笔、纸。

三、实验原理

1、应用傅里叶变换进行图像处理
傅里叶变换是线性系统分析的一个有力工具,它能够定量地分析诸如数字化系统、采样点、电子放大器、卷积滤波器、噪音和显示点等的作用。通过实验培养这项技能,将有助于解决大多数图像处理问题。对任何想在工作中有效应用数字图像技术的人来说,把时间用在学习和掌握傅里叶变换上是很有必要的。
2、傅里叶(Fourier)变换的定义
对于二维信号,二维Fourier变换定义为:
二维Fourier变换
逆变换:
二维离散傅里叶
二维离散傅里叶变换为:
二维离散傅里叶变换
逆变换:
逆变换
图像的傅里叶变换与一维信号的傅里叶变换一样,有快速算法,具体参见参考书目,有关傅里叶变换的快速算法的程序不难找到。实际上,现在有实现傅里叶变换的芯片,可以实时实现傅里叶变换。
3、利用MATLAB软件实现数字图像傅里叶变换、DCT变换的程序。

四、实验步骤

1、打开计算机,安装和启动MATLAB程序;程序组中“work”文件夹中应有待处理的图像文件;
2、利用MATLAB工具箱中的函数绘制FFT频谱显示的函数;
3、a)调入、显示图像;
b)对这图像做FFT、DCT并利用自编的函数显示其频谱;
c)讨论不同的图像内容与FFT、DCT频谱之间的对应关系。
4、记录和整理实验报告。

五、实验内容

MATLAB源程序如下:

clear
clc
img=imread('peppers.png');
subplot(2,2,1);imshow(img);title('原图');
f=rgb2gray(img);    %对于RGB图像必须做的一步,也可以用im2double函数
F=fft2(f);          %傅里叶变换
F1=log(abs(F)+1);   %取模并进行缩放
subplot(2,2,2);imshow(F1,[]);title('傅里叶变换频谱图');
Fs=fftshift(F);      %将频谱图中零频率成分移动至频谱图中心
S=log(abs(Fs)+1);    %取模并进行缩放
subplot(2,2,3);imshow(S,[]);title('频移后的频谱图');
fr=real(ifft2(ifftshift(Fs)));  %频率域反变换到空间域,并取实部
ret=im2uint8(mat2gray(fr));    %更改图像类型
subplot(2,2,4);imshow(ret),title('逆傅里叶变换');

六、实验结果

在MATLAB中运行后,实验结果如图:
在Figure1中,左上角显示的是读入MATLAB程序的原图片,右上角显示的是经过二维傅里叶快速变换后的频谱图像,左下角显示的是将频谱中零频率成分移至矩阵的中心后的频谱图像。右下角显示的是二维傅里叶逆变换后的图像。

图1 MATLAB程序运行后结果
图1 MATLAB程序运行后结果

七、实验中遇到的问题及对实验过程的思考

1、关于imshow函数:
使用imshow函数显示图像时要注意图像矩阵类型,当图像是double类型时要使用imshow(I,[])来根据数据矩阵的数值范围自动设置灰度图像显示范围。
详细可参考matlab官网参考文档:显示图像-MATLAB imshow-MathWorks中国

2、关于运行时可能出现的警告:
如果图像进行傅里叶转换后立即用imshow函数显示,则在命令行可能会显示:Warning: Displaying real part of complex input(警告: 显示复数输入项的实部)。这是因为经过傅里叶变换后的图像矩阵大多是复数矩阵,包含实部和虚部。此时如要显示图像则需要先用abs取复数矩阵的模,再进行显示。
取模后图像矩阵的数值一般会很大,直接用imshow函数是无法显示的,此时可以用log函数取其对数,如log(abs(F)+1),这样就可以对频谱进行缩放。至于为什么用log(F+1),如下图所示,对于(0,1)之间的x值经过取对数后会变成负值,而log(x+1)则将所有的x值映射到正数范围内。
图2 log
图2 log

3、关于开头im2double和rgb2gray函数的使用:
对于RGB真彩图像来说,读入后是以三维矩阵形式存储的,如果此时直接进行傅里叶变换,则频谱图会显示为一片空白或者是密密麻麻的。所以在对RGB图像进行傅里叶变换前要进行类型转换,可以使用im2double将其转换为双精度型(图像运算很少有整型的,所以保守起见不管什么图像都先用这个函数进行转换),或者使用rgb2gray将其转换为灰度图像。
使用不同的函数其变换效果也是不一样的。如使用im2double,进行傅里叶变换后其频谱图呈白色基调,使用rgb2gray其频谱图呈灰色基调。

4、关于最后使用im2uint8转换图像类型:
这一步是为了将逆转换得到的矩阵先转换为灰度图像(mat2gray),再将图像类型转换为uint8。其实这一步的调用与否与开头两个类型转换函数的使用有关,如果在开头就已经将RGB图像转为灰度图像,则此步骤可省去,直接显示经逆转换的图像。如果开头调用im2double,此步省略后可显示出彩色图像。当然此步骤在不同方面发挥着不同作用,取的灰度图像可以为后续操作提供基础。

更多函数信息可参考matlab官网 MATLAB-函数

如有错漏之处敬请指正

发布了13 篇原创文章 · 获赞 32 · 访问量 1万+

猜你喜欢

转载自blog.csdn.net/weixin_43637490/article/details/89196212