【数字图像处理】傅里叶变换
实验原理及知识点
1.应用傅里叶变换进行图像处理
傅里叶变换是线性系统分析的一个有力工具,它能够定量地分析诸如数字化系统、采样点、电子放大器、卷积滤波器、噪音和显示点等的作用。通过实验培养这项技能,将有助于解决大多数图像处理问题。对任何想在工作中有效应用数字图像处理技术的人来说,把时间用在学习和掌握博里叶变换上是很有必要的。
2.傅立叶(Fourier)变换的定义
对于二维信号,二维Fourier变换定义为:
逆变换:
二维离散傅立叶变换为:
逆变换:
图像的傅立叶变换与一维信号的傅立叶变换变换一样,有快速算法,具体参见参考书目,有关傅立叶变换的快速算法的程序不难找到。实际上,现在有实现傅立叶变换的芯片,可以实时实现傅立叶变换。
实验内容
1.读入一副图像,对其进行傅里叶变换,分别显示,原图,傅里叶变换图,中心化后图。
1 2 3 4 5 6 7 8 9 10 11 | clear ; clc ; Img= imread ( 'LongyuanCai.jpg' ); %读入原图 I=rgb2gray(Img); %将RGB图像变换 IF= fft2 (I); %进行傅里叶变换 I1= log ( abs (IF)+1); %取模后缩放 IC= fftshift (I1); %将频谱图中零频率成分移动至频谱图中心(中心化) I2= log ( abs (IC)+1); %取模后缩放显示中心化后图 figure ; subplot (131);imshow(Img); title ( '原图' ); subplot (132);imshow(I1,[]); title ( '傅里叶变换图' ); subplot (133);imshow(I2,[]); title ( '中心化后图' ); |
实验问题及解决:
%1.取模后图像矩阵的数值一般会很大,直接用imshow函数是无法显示的,此时可以用log函数取其对数,如log(abs(F)+1),这样就可以对频谱进行缩放。
%2.fftshift将频谱图中零频率成分移动至频谱图中心
%3.傅里叶变换和频移图imshow函数需要加上[]才能显示
%4.abs作用是将所得变量绝对值和复数求模
2.生成一副图像(简单的黑底白块),对其进行旋转变换,分别对原图和旋转后的图像进行离散傅里叶变换,显示2副傅里叶变换图。
1 2 3 4 5 6 7 8 9 10 | clear ; clc ; I= zeros (256,256);I(59:237,120:136)=1; J=imrotate(I,45, 'bilinear' , 'crop' ); I1= fft2 (I);F= abs (I1);I2= fftshift (F); J1= fft2 (J);F= abs (J1);J2= fftshift (F); subplot (221);imshow(I); subplot (222);imshow(J); subplot (223);imshow(I2,[]); subplot (224);imshow(J2,[]); |
实验问题及解决:
%显示傅里叶频谱需要进行:1.傅里叶变换(fft2)
%2.变换后的变量求模(abs)
%3.转换成频谱图并将频谱图中零频率成分移动至频谱图中心(fftshift)
3.读入一副图像,将其变为灰度图。加入高斯噪声,并分别对加入噪声前后的图像进行傅里叶变换,并显示。
1 2 3 4 5 6 7 8 9 10 | clear ; clc ; Img= imread ( 'GirlFriend.jpg' ); %读入图像 I=rgb2gray(Img); %图像由RGB变成灰度图 I1= fft (I);F= abs (I1);I2= fftshift (F); %噪声前傅里叶变换 J=imnoise(I, 'gaussian' ,0,0.01); %加入高斯噪声 J1= fft (J);F= abs (J1);J2= fftshift (F); %噪声后傅里叶变换 figure ; subplot (131);imshow(I); title ( '灰度图' ); subplot (132);imshow(I2,[]); title ( '傅里叶变换图' ); subplot (133);imshow(J2,[]); title ( '噪声后图' ); |
4.生成一副图像(简单的黑底白块,参考下面生成程序,但是需自己重新设定数值),进行离散傅里叶变换,再对其分别进行X轴与Y轴上的平移,并分别对其进行离散傅里叶变换,观察3副傅里叶变换图。需显示6幅图,原图,行平移图,列平移图,行平移傅里叶变换图(频谱中心化),列平移傅里叶变换图(频谱中心化)。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 | clear ; clc ; I= zeros (256,256);I(59:230,120:136)=1; %产生原图(行坐标修改) [M,N]= size (I);g= zeros (M,N);h= zeros (M,N); a=20;b=20; for i =1:M %行平移 for j =1:N if (( i -a>0)&&( i -a<M)) g( i , j )=I( i -a, j ); else g( i , j )=0; end end end for j =1:N %列平移 for i =1:M if (( j -b>0)&&( j -b<N)) h( i , j )=I( i , j -b); else h( i , j )=0; end end end I1= fftshift ( abs ( fft2 (I))); g1= fftshift ( abs ( fft2 (g))); h1= fftshift ( abs ( fft2 (h))); figure ; subplot (231);imshow(I); title ( '原图' ); subplot (232);imshow(g); title ( '行平移图' ); subplot (233);imshow(h); title ( '列平移图' ); subplot (234);imshow(I1,[]); title ( '原图傅里叶变换图' ); subplot (235);imshow(g1,[]); title ( '行平移傅里叶变换图' ); subplot (236);imshow(h1,[]); title ( '列平移傅里叶变换图' ); |
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 震惊!C++程序真的从main开始吗?99%的程序员都答错了
· 别再用vector<bool>了!Google高级工程师:这可能是STL最大的设计失误
· 单元测试从入门到精通
· 【硬核科普】Trae如何「偷看」你的代码?零基础破解AI编程运行原理
· 上周热点回顾(3.3-3.9)