1、了解图像变换的意义和手段;
2、熟悉傅里叶变换的基本性质;
3、熟练掌握FFT的方法与应用;
4、通过实验了解二维频谱的分布特点;
5、通过本实验掌握利用MATLAB编程,实现数字图像的傅里叶变换。
1、计算机;
2、MATLAB程序;
3、移动式存储器(软盘、U盘等);
4、记录用的笔、纸。
1、应用傅里叶变换进行图像处理
傅里叶变换是线性系统分析的一个有力工具,它能够定量地分析诸如数字化系统、采样点、电子放大器、卷积滤波器、噪音和显示点等的作用。通过实验培养这项技能,将有助于解决大多数图像处理问题。对任何想在工作中有效应用数字图像技术的人来说,把时间用在学习和掌握傅里叶变换上是很有必要的。
2、傅里叶(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、关于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
3、关于开头im2double和rgb2gray函数的使用:
对于RGB真彩图像来说,读入后是以三维矩阵形式存储的,如果此时直接进行傅里叶变换,则频谱图会显示为一片空白或者是密密麻麻的。所以在对RGB图像进行傅里叶变换前要进行类型转换,可以使用im2double将其转换为双精度型(图像运算很少有整型的,所以保守起见不管什么图像都先用这个函数进行转换),或者使用rgb2gray将其转换为灰度图像。
使用不同的函数其变换效果也是不一样的。如使用im2double,进行傅里叶变换后其频谱图呈白色基调,使用rgb2gray其频谱图呈灰色基调。
4、关于最后使用im2uint8转换图像类型:
这一步是为了将逆转换得到的矩阵先转换为灰度图像(mat2gray),再将图像类型转换为uint8。其实这一步的调用与否与开头两个类型转换函数的使用有关,如果在开头就已经将RGB图像转为灰度图像,则此步骤可省去,直接显示经逆转换的图像。如果开头调用im2double,此步省略后可显示出彩色图像。当然此步骤在不同方面发挥着不同作用,取的灰度图像可以为后续操作提供基础。
更多函数信息可参考matlab官网 MATLAB-函数
如有错漏之处敬请指正