大学matlab课程设计图像的傅里叶变换及其应用
- 格式:doc
- 大小:140.00 KB
- 文档页数:7
matlab中进行傅里叶变换# MATLAB中的傅里叶变换及应用## 引言傅里叶变换是信号处理领域中一项重要的数学工具,广泛应用于信号分析、图像处理、通信等领域。
MATLAB作为一种高效的科学计算软件,提供了强大的傅里叶变换工具,使得用户能够方便地进行信号频谱分析和处理。
本文将介绍MATLAB中傅里叶变换的基本概念、函数使用方法,并结合实例展示其在信号处理中的应用。
## 1. 傅里叶变换的基本概念### 1.1 时域与频域傅里叶变换是将时域信号转换到频域的一种数学工具。
在时域中,信号是关于时间的函数;而在频域中,信号则是关于频率的函数。
通过傅里叶变换,我们能够将信号在时域和频域之间进行转换,从而更好地理解信号的特性。
### 1.2 连续与离散傅里叶变换MATLAB中的傅里叶变换涵盖了连续和离散两种情况。
对于连续信号,可以使用`fft`函数进行变换;对于离散信号,可以使用`fft`函数进行快速傅里叶变换。
这两种情况下,变换的结果分别为连续频谱和离散频谱。
## 2. MATLAB中的傅里叶变换函数MATLAB提供了丰富的傅里叶变换函数,包括`fft`、`ifft`、`fft2`等。
这些函数可以适用于不同类型的信号,如一维信号、二维信号等。
以下是其中一些常用函数的简要介绍:### 2.1 `fft`函数`fft`函数用于计算一维离散傅里叶变换。
其基本语法为:```matlabY = fft(X)```其中,`X`为输入的离散信号,而`Y`则为变换后的频谱。
### 2.2 `ifft`函数`ifft`函数用于计算一维离散傅里叶反变换。
其基本语法为:```matlabX = ifft(Y)```其中,`Y`为输入的频谱,而`X`则为反变换后的信号。
### 2.3 `fft2`函数对于二维信号,可以使用`fft2`函数进行二维离散傅里叶变换。
其基本语法为:```matlabY = fft2(X)```同样,`X`为输入的二维信号,而`Y`则为变换后的二维频谱。
傅里叶变换一.实验内容:1、傅里叶变换二.实验目的:1、理解傅里叶变换的原理2、掌握傅里叶变换的性质三.实验步骤:1.首先构造一幅黑白二值图像,在128×128的黑色背景中心产生一个4×4的白色方块,对其进行傅里叶变换;(Matlab 中用fft2实现2D 傅里叶变换)2.把低频分量移到图象中心,而把高频分量移到四个角上;(方法有两种:其一,在FT 以前对测试图象逐点加权(-1)^(i+j);其二,利用FFTSHIFT 函数);3.利用图象增强中动态范围压缩的方法增强2DFT ;(Y =C*log (1+abs (X)));4.构造一幅黑白二值图像,在128×128的黑色背景中令第32行至36行、第32列至第36列的值为1(即产生一个4×4的白色方块),对其进行傅里叶变换;5.将上图旋转300,再进行傅里叶变换 (imrotate )6.构造二幅黑白二值图像,在128×128的黑色背景中分别令第60行至68行、第60列至第68列的值为1,第64行至65行、第64列至第65列的值为1产生两幅图像,分别对这两幅图像进行傅里叶变换四、原理分析、技术讨论、回答问题1、对于第二幅图像(第一步与第四步图像的比较),说明FOURIER 变换具有以下性质:)//(20000),(),(N vy M ux j e v u F y y x x f +-⇔--π2、对于第三幅图像(第一步与第五步图像的比较),说明FOURIER 变换具有以下性质:θcos r x = θs i n r y = αωc o s =u αωs i n =v),(),(00θαωθθ+⇔+F r f3、对于第四幅图像(第一步与第六步图像的比较),说明FOURIER 变换具有以下性质:)/,/(||1),(b v a u F ab by ax f =五、结果如下六、M文件如下:a=zeros(128,128);a(63:66,63:66)=1;A=fft2(a);b=fftshift(A);for i=1:128for j=1:128B(i,j)=log(1+abs(A(i,j)));endendh=zeros(128,128);h(32:36,32:36)=1;H=fft2(h);h1=imrotate(h,30);H1=fft2(h1);i=zeros(128,128);i(60:68,60:68)=1;I=fft2(i);j=zeros(128);j(64:65,64:65)=1;J=fft2(j);figure;subplot(221),imshow(a);title('原图');subplot(222),imshow(A);title('FT');subplot(223),imshow(b);title('低中高角FT'); subplot(224),imshow(B);title('增强2DFT');figure;subplot(221);imshow(a);title('Step 1原图'); subplot(222);imshow(A);title('Step 1FT'); subplot(223);imshow(h);title('Step 4原图'); subplot(224);imshow(H);title('Step 4FT');figure;subplot(221),imshow(a);title('Step 1原图'); subplot(222),imshow(A);title('Step 1FT'); subplot(223),imshow(h1);title('Step 5原图'); subplot(224),imshow(H1);title('Step 5FT');figure;subplot(321);imshow(a);title('Step 1原图'); subplot(322);imshow(A);title('Step 1FT'); subplot(323),imshow(i);title('Step 6原图1'); subplot(324),imshow(I);title('Step 6原图1FT'); subplot(325),imshow(j);title('Step 6原图2'); subplot(326),imshow(J);title('Step 6原图2FT');。
翻转裁剪后二次采样原图I1=imread('D:\图像\LENA.BMP');imshow(I1);fp=I1(end:-1:1,:)%figure,imshow(fp);fc=I1(128:512,128:512)%figure,imshow(fc);fs=I1(4:2:end,4:2:end);%figure,imshow(fs);subplot(2,2,1),imshow(fp);title('翻转')subplot(2,2,2),imshow(fc);title('裁剪后')subplot(2,2,3),imshow(fs);title('二次采样')subplot(2,2,4),imshow(I1);title('原图')对图像进行傅立叶变换代码如下:a=zeros(128,128);a(63:66,63:66)=1;A=fft2(a);b=fftshift(A);for i=1:128for j=1:128B(i,j)=log(1+abs(A(i,j)));endendh=zeros(128,128);h(32:36,32:36)=1;H=fft2(h);h1=imrotate(h,30);H1=fft2(h1);i=zeros(128,128);i(60:68,60:68)=1;I=fft2(i);j=zeros(128);j(64:65,64:65)=1;J=fft2(j);figure;subplot(221),imshow(a);title('原图');subplot(222),imshow(A);title('FT');subplot(223),imshow(b);title('低中高角FT'); subplot(224),imshow(B);title('增强2DFT');figure;subplot(221);imshow(a);title('Step1原图'); subplot(222);imshow(A);title('Step1FT'); subplot(223);imshow(h);title('Step4原图'); subplot(224);imshow(H);title('Step4FT');figure;subplot(221),imshow(a);title('Step1原图'); subplot(222),imshow(A);title('Step1FT'); subplot(223),imshow(h1);title('Step5原图'); subplot(224),imshow(H1);title('Step5FT');figure;subplot(321);imshow(a);title('Step1原图'); subplot(322);imshow(A);title('Step1FT'); subplot(323),imshow(i);title('Step6原图1'); subplot(324),imshow(I);title('Step6原图1FT'); subplot(325),imshow(j);title('Step6原图2'); subplot(326),imshow(J);title('Step6原图2FT');运行结果如下:分析:图像傅立叶变换前后的对应关系:傅立叶变换以前,图像(未压缩的位图)是由对在连续空间(现实空间)上的采样得到一系列点的集合,习惯上用一个二维矩阵表示空间上各点,则图像可由z=f(x,y)来表示。
傅里叶变换及其在数字图像处理中的应用王家硕 学号:1252015一、 Fourier 变换1. 一维连续傅里叶变换设 f (x)为x 的实变函数,如果f (x)满足下面的狄里赫莱条件: (1)具有有限个间隔点。
(2)具有有限个极点。
(3)绝对可积。
则 f (x )的傅里叶变换(Fourier Transformation ,FT )定义为: Fourier 正变换:dt e t f t f f F t j ⎰+∞∞--==ωω)()]([)(;Fourier 逆变换:ωωπωd e f t F f t f t j ⎰∞+∞---==)(21)]([)(1,式中:1-=j ,ω 为频域变量。
f (x )与F (w )构成傅里叶变换对,可以证明傅里叶变换对总是存在的。
由于f (x )为实函数,则它的傅里叶变换F (w )通常是复函数,于是F (w )可写成F (w ) = R (w ) + j I (w ) (1)式中:R (w )和I (w )分别是F (w )的实部和虚部。
公式1可表示为指数形式:式中:F (w ) 为f (x )的傅里叶幅度谱,f (w )为f (x )的相位谱。
2. 二维连续傅里叶变换如果二维函数f (x , y )是连续可积的,即∞<⎰⎰+∞∞-dxdy y x f |),(,且F (u , v )是可积的,则二维连续傅里叶变换对可表示为:dt e y x f v u F t j ⎰⎰+∞∞--+∞∞-=ω),(),(dt e v u F y x F t j ⎰⎰∞+∞-∞+∞-=ω),(),(对于图像 f (x, y),F(u, v)是它的频谱。
变量u 是对应于x 轴的空间频率,变量v 是对应于y 轴的空间频率,与在一维的情况类似,可定义二维傅里叶变换的幅度谱和相位谱为:3.一维离散傅里叶变换对一个连续函数f (x)等间隔采样可得到一个离散序列。
设共采样N个,则这个离散序列可表示为{ f (0), f (1), f (2), , f (N -1)}。
matlab实现信号的傅立叶变换一、设计目的1.熟悉和掌握matlab的基本使用方法,能够熟练运用matlab。
ﻩ2.巩固信号与系统中的傅立叶变换内容,加深对这部分内容的理解。
二、设计任务ﻩ1.掌握matlab的基本操作。
2.利用matlab实现典型非周期信号的傅立叶变换,画出信号的时域图和频域图。
3.利用matlab实现傅立叶变换的基本性质。
三、设计原理1.matlab简介MATLAB是MathWorks公司推出的一套高性能的数值计算和可视化软件,经过多年大量的、坚持不懈的改进,现在MATLAB已经更新至7.x版。
MATLAB集数值分析、矩阵运算、信号处理和图形显示于一体,构成了一个方便的、界面友好的用户环境。
在这个环境下,对所要求解的问题,用户只需简单地列出数学表达式,其结果便以人们十分熟悉的数值或图形方式显示出来。
MATLAB可用来解决实际的工程和数学问题,其典型应用有:通用的数值计算,算法设计,各种学科(如自动控制、数字信号处理、统计信号处理)等领域的专门问题求解。
MATLAB语言易学易用,不要求用户有高深的数学和程序语言知识,不需要用户深刻了解算法及编程技巧。
MATLAB既是一种编程环境,又是一种程序设计语言。
这种语言与C、FORTRAN等语言一样,有其内定的规则,但MATLAB的规则更接近数学表示。
使用更为简便,可使用户大大节约设计时间,提高设计质量。
2.matlab2013b基本界面介绍matlab2013b主界面窗口基本分为五个部分:1)主菜单界面在此界面我们只需要用到新建命令文件和对程序进行间断调试的功能2)文件查看窗口,双击可快速打开文件3)写命令窗口及提示窗口在这个窗口可写入参数、写入公式、显示错误、显示帮助等功能,例如对a赋值、写入公式f =a*a、显示帮助:公式fft的使用方法4)历史命令查看窗口在该窗口可查看历史输入命令,双击历史命令可再次输入到命令窗口5)数值查看窗口在该窗口可查看所有参数详细数值3.理论原理:傅里叶变换的基本思想首先由法国学者傅里叶系统提出,所以以其名字来命名以示纪念。
图像处理之傅里叶变换matlab实现傅里叶变换是一种将时域信号转换为频域信号的数学工具。
在图像处理中,傅里叶变换可以用于图像的频域分析和滤波,以及图像的压缩和增强等应用。
Matlab是一种功能强大的数值计算和图形化工具,它提供了丰富的函数和工具箱,可以方便地进行傅里叶变换的实现。
在Matlab中,可以使用fft2函数对图像进行二维傅里叶变换。
该函数的基本语法如下:Y = fft2(X)其中,X是输入的图像矩阵,Y是输出的频域图像矩阵。
Y的大小与X 相同,表示了图像在频域中的分布情况。
为了更好地理解傅里叶变换的过程,我们可以使用一幅灰度图像作为示例进行实现。
首先,我们需要读取图像并将其转换为灰度图像。
可以使用imread函数读取图像,并使用rgb2gray函数将图像转换为灰度图像:img = imread('image.jpg');gray_img = rgb2gray(img);接下来,我们可以对灰度图像进行傅里叶变换。
首先,我们需要将图像矩阵进行归一化操作,以避免频谱的幅度过大。
可以使用im2double函数将图像矩阵转换为双精度类型:normalized_img = im2double(gray_img);然后,我们可以使用fft2函数对归一化后的图像矩阵进行傅里叶变换:fft_img = fft2(normalized_img);得到的fft_img是一个复数矩阵,包含了图像在频域中的幅度和相位信息。
为了更好地可视化频域图像,可以使用fftshift函数将频域图像的零频率移到中心位置:shifted_fft_img = fftshift(fft_img);最后,我们可以使用abs函数计算频域图像的幅度谱,并使用matshow函数将其显示出来:amplitude_spectrum = abs(shifted_fft_img);imshow(amplitude_spectrum, []);通过以上步骤,我们就可以实现对图像的傅里叶变换,并显示出频域图像的幅度谱。
光学图像处理实验报告学生姓名:班级:学号:指导教师:日期:一、实验室名称:二、实验项目名称: 图像变换三、实验原理:傅立叶变换是信号处理领域中一个重要的里程碑,它在图像处理技术中同样起着十分重要的作用,被广泛的应用于图像特征提取、图像增强与恢复、噪声抑制、纹理分析等多个方面。
1、离散傅立叶变换(DFT ):要把傅立叶变换应用到数字图像处理当中,就必须处理离散数据,离散傅立叶变换的提出使得这种数学方法能够和计算机技术联系起来。
正变换:逆变换:幅度:相位角:功率谱:2、快速傅立叶变换(FFT ): 离散傅立叶变换运算量巨大,计算时间长,其运算次数正比于N^2,当N 比较大的时候,运算时间更是迅速增长。
二快速傅立叶变换的提出将傅立叶变换的复杂度由N^2下降到了NlgN/lg2,当N 很大时计算量可大大减少。
而快速傅立叶变换(FFT)需要进行基2或者基4的蝶形运算,算法上面较离散傅立叶变换困难。
∑∑-=-=+-=1010)//(2),(1),(M x N y N vy M ux j e y x f MN v u F π∑∑-=-=+=1010)//(2),(),(M x N y N vy M ux j e v u F y x f π3、离散余弦变换(DCT):为FT 的特殊形式,被展开的函数是实偶函数的傅氏变换,即只有余弦项。
变换核固定,利于硬件实现。
具有可分离特性,一次二维变换可分解为两次一维变换。
正变换:逆变换:其中:四、实验目的:1. 了解各种图像正交变换的作用和用途;2. 掌握各种图像变换的方法和原理;3. 熟练掌握离散傅立叶变换(DFT)、离散余弦变换(DCT)的原理、方法和实现流程,熟悉两种变换的性质,并能对图像傅立叶变换的结果进行必要解释;4. 熟悉和掌握利用Matlab 工具进行图像傅立叶变换及离散余弦变换的基本步骤、MATLAB 函数使用及具体变换处理流程;5. 能熟练应用Matlab 工具对图像进行FFT 及DCT 处理,并能根据需要进行必要的频谱分析和可视化显示。
课程名称: MATLAB及在电子信息课程中的应用实验名称:图像的傅里叶变换及其应用设计四图像的傅里叶变换及其应用一、设计目的通过该设计,掌握傅里叶变换的定义及含义。
二、设计内容及主要的MATLAB 函数1、图像的离散傅里叶变换假设),(n m f 是一个离散空间中的二维函数,则该函数的二维傅里叶变换定义为nj m j e e n m f f 21),()2,1(ωωωω--∞∞-∞∞-∑∑=其中21ωω和是频域变量,单位是弧度/采样单元。
函数),(21ωωf 为函数),(n m f 的频谱。
二维傅里叶反变换的定义为21212121),(),(ωωωωωωππωππωd d e e f n m f n j m j ⎰⎰-=-==因此,函数),(n m f 可以用无数个不同频率的复指数信号的和表示,在频率),(21ωω处复指数信号的幅度和相位为),(21ωωfMATLAB 提供的快速傅里叶变换函数1)fft2:用于计算二维快速傅里叶变换,其语法格式为b=fft2(I),返回图像I 的二维傅里叶变换矩阵,输入图像I 和输出图像B 大小相同;b=fft2(I,m,n),通过对图像I 剪切或补零,按用户指定的点数计算二维傅里叶变换,返回矩阵B 的大小为m ⨯n 。
很多MATLAB 图像显示函数无法显示复数图像,为了观察图像傅里叶变换后的结果,应对变换后的结果求模,方法是对变换结果使用abs 函数。
2)fftn :用于计算n 维快速傅里叶变换,其语法格式为b=fftn(I),计算图像的n 维傅里叶变换,输出图像B 和输入图像I 大小相同; b=fftn(I, size),通过对图像I 剪切或补零,按size 指定的点数计算n 维傅里叶变换,返回矩阵B 的大小为size 。
3) fftshift :用于将变换后的图像频谱中心从矩阵的原点移到矩阵的中心,其语法格式为b=fftshift(I),将变换后的图像频谱中心从矩阵的原点移到矩阵的中心。
数字图像处理及MATLAB实现实验四——图像变换1.图像的傅⾥叶变换⼀(平移性质)傅⾥叶变换的平移性质表明了函数与⼀个指数项相乘等于将变换后的空域中⼼移到新的位置,并且平移不改变频谱的幅值。
I=imread('1.bmp');figure(1)imshow(real(I));I=I(:,:,3);fftI=fft2(I);sfftI=fftshift(fftI); %求离散傅⾥叶频谱%对原始图像进⾏⼆维离散傅⾥叶变换,并将其坐标原点移到频谱图中央位置RRfdp1=real(sfftI);IIfdp1=imag(sfftI);a=sqrt(RRfdp1.^2+IIfdp1.^2);a=(a-min(min(a)))/(max(max(a))-min(min(a)))*225;figure(2)imshow(real(a));I=imread('2.bmp');figure(1)imshow(real(I));I=I(:,:,3);fftI=fft2(I);sfftI=fftshift(fftI); %求离散傅⾥叶频谱%对原始图像进⾏⼆维离散傅⾥叶变换,并将其坐标原点移到频谱图中央位置RRfdp1=real(sfftI);IIfdp1=imag(sfftI);a=sqrt(RRfdp1.^2+IIfdp1.^2);a=(a-min(min(a)))/(max(max(a))-min(min(a)))*225;figure(2)imshow(real(a));I=imread('3.bmp');figure(1)imshow(real(I));I=I(:,:,3);fftI=fft2(I);sfftI=fftshift(fftI); %求离散傅⾥叶频谱%对原始图像进⾏⼆维离散傅⾥叶变换,并将其坐标原点移到频谱图中央位置RRfdp1=real(sfftI);IIfdp1=imag(sfftI);a=sqrt(RRfdp1.^2+IIfdp1.^2);a=(a-min(min(a)))/(max(max(a))-min(min(a)))*225;figure(2)imshow(real(a));实验结果符合傅⾥叶变换平移性质2.图像的傅⾥叶变换⼆(旋转性质)%构造原始图像I=zeros(256,256);I(88:168,124:132)=1; %图像范围是256*256,前⼀值是纵向⽐,后⼀值是横向⽐imshow(I)%求原始图像的傅⾥叶频谱J=fft2(I);F=abs(J);J1=fftshift(F);figureimshow(J1,[550])%对原始图像进⾏旋转J=imrotate(I,90,'bilinear','crop');figureimshow(J)%求旋转后图像的傅⾥叶频谱J=fft2(I);F=abs(J);J2=fftshift(F);figureimshow(J2,[550])3.图像的离散余弦变换⼀%对cameraman.tif⽂件计算⼆维DCT变换RGB=imread('cameraman.tif');figure(1)imshow(RGB)I=rgb2gray(RGB);%真彩⾊图像转换成灰度图像J=dct2(I);%计算⼆维DCT变换figure(2)imshow(log(abs(J)),[])%图像⼤部分能量集中在左上⾓处figure(3);J(abs(J)<10)=0;%把变换矩阵中⼩于10的值置换为0,然后⽤idct2重构图像K=idct2(J)/255;imshow(K)4.图像的离散余弦变换⼆% I=imread('1.bmp');% figure(1)% imshow(real(I));% I=I(:,:,3);% fftI=fft2(I);% sfftI=fftshift(fftI); %求离散傅⾥叶频谱% %对原始图像进⾏⼆维离散傅⾥叶变换,并将其坐标原点移到频谱图中央位置% RRfdp1=real(sfftI);% IIfdp1=imag(sfftI);% a=sqrt(RRfdp1.^2+IIfdp1.^2);% a=(a-min(min(a)))/(max(max(a))-min(min(a)))*225;% figure(2)% imshow(real(a));% I=imread('2.bmp');% figure(1)% imshow(real(I));% I=I(:,:,3);% fftI=fft2(I);% sfftI=fftshift(fftI); %求离散傅⾥叶频谱% %对原始图像进⾏⼆维离散傅⾥叶变换,并将其坐标原点移到频谱图中央位置% RRfdp1=real(sfftI);% IIfdp1=imag(sfftI);% a=sqrt(RRfdp1.^2+IIfdp1.^2);% a=(a-min(min(a)))/(max(max(a))-min(min(a)))*225;% figure(2)% imshow(real(a));% I=imread('3.bmp');% figure(1)% imshow(real(I));% I=I(:,:,3);% fftI=fft2(I);% sfftI=fftshift(fftI); %求离散傅⾥叶频谱% %对原始图像进⾏⼆维离散傅⾥叶变换,并将其坐标原点移到频谱图中央位置% RRfdp1=real(sfftI);% IIfdp1=imag(sfftI);% a=sqrt(RRfdp1.^2+IIfdp1.^2);% a=(a-min(min(a)))/(max(max(a))-min(min(a)))*225;% figure(2)% imshow(real(a));% %构造原始图像% I=zeros(256,256);% I(88:168,124:132)=1; %图像范围是256*256,前⼀值是纵向⽐,后⼀值是横向⽐% imshow(I)% %求原始图像的傅⾥叶频谱% J=fft2(I);% F=abs(J);% J1=fftshift(F);figure% imshow(J1,[550])% %对原始图像进⾏旋转% J=imrotate(I,90,'bilinear','crop');% figure% imshow(J)% %求旋转后图像的傅⾥叶频谱% J=fft2(I);% F=abs(J);% J2=fftshift(F);figure% imshow(J2,[550])% %对cameraman.tif⽂件计算⼆维DCT变换% RGB=imread('cameraman.tif');% figure(1)% imshow(RGB)% I=rgb2gray(RGB);% %真彩⾊图像转换成灰度图像% J=dct2(I);% %计算⼆维DCT变换% figure(2)% imshow(log(abs(J)),[])% %图像⼤部分能量集中在左上⾓处% figure(3);% J(abs(J)<10)=0;% %把变换矩阵中⼩于10的值置换为0,然后⽤idct2重构图像% K=idct2(J)/255;% imshow(K)RGB=imread('cameraman.tif');I=rgb2gray(RGB);I=im2double(I); %转换图像矩阵为双精度型T=dctmtx(8); %产⽣⼆维DCT变换矩阵%矩阵T及其转置T'是DCT函数P1*X*P2的参数B=blkproc(I,[88],'P1*x*P2',T,T');maxk1=[ 1111000011100000110000001000000000000000000000000000000000000000 ]; %⼆值掩模,⽤来压缩DCT系数B2=blkproc(B,[88],'P1.*x',mask1); %只保留DCT变换的10个系数I2=blkproc(B2,[88],'P1*x*P2',T',T); %重构图像figure,imshow(T);figure,imshow(B2);figure,imshow(I2);RGB=imread('cameraman.tif');I=rgb2gray(RGB);I=im2double(I); %转换图像矩阵为双精度型T=dctmtx(8); %产⽣⼆维DCT变换矩阵%矩阵T及其转置T'是DCT函数P1*X*P2的参数B=blkproc(I,[88],'P1*x*P2',T,T');maxk1=[ 1111000011100000100000000000000000000000000000000000000000000000 ]; %⼆值掩模,⽤来压缩DCT系数B2=blkproc(B,[88],'P1.*x',mask1); %只保留DCT变换的10个系数I2=blkproc(B2,[88],'P1*x*P2',T',T); %重构图像figure,imshow(T);figure,imshow(B2);figure,imshow(I2);5.图像的哈达玛变换cr=0.5;I=imread('cameraman.tif');I=im2double(I)/255; %将读⼊的unit8类型的RGB图像I转换为double类型的数据figure(1),imshow(I);%显⽰%求图像⼤⼩[m_I,n_I]=size(I); %提取矩阵I的⾏列数,m_I为I的⾏数,n_I为I的列数sizi=8;snum=64;%分块处理t=hadamard(sizi) %⽣成8*8的哈达码矩阵hdcoe=blkproc(I,[sizi sizi],'P1*x*P2',t,t');%将图⽚分成8*8像素块进⾏哈达码变换%重新排列系数CE=im2col(hdcoe,[sizi,sizi],'distinct');%将矩阵hdcode分为8*8互不重叠的⼦矩阵,再将每个⼦矩阵作为CE的⼀列[Y Ind]=sort(CE); %对CE进⾏升序排序%舍去⽅差较⼩的系数,保留原系数的⼆分之⼀,即32个系数[m,n]=size(CE);%提取矩阵CE的⾏列数,m为CE的⾏数,n为CE的列数snum=snum-snum*cr;for i=1:nCE(Ind(1:snum),i)=0;end%重建图像re_hdcoe=col2im(CE,[sizi,sizi],[m_I,n_I],'distinct');%将矩阵的列重新组织到块中re_I=blkproc(re_hdcoe,[sizi sizi],'P1*x*P2',t',t);%进⾏反哈达码变换,得到压缩后的图像re_I=double(re_I)/64; %转换为double类型的数据figure(2);imshow(re_I);%计算原始图像和压缩后图像的误差error=I.^2-re_I.^2;MSE=sum(error(:))/prod(size(re_I));。
课程名称: MATLAB及在电子信息课程中的应用实验名称:图像的傅里叶变换及其应用
设计四图像的傅里叶变换及其应用
一、设计目的
通过该设计,掌握傅里叶变换的定义及含义。
二、设计内容及主要的MATLAB 函数
1、图像的离散傅里叶变换
假设),(n m f 是一个离散空间中的二维函数,则该函数的二维傅里叶变换定义为
n
j m j e e n m f f 21),()2,1(ωωωω--∞∞-∞∞-∑∑=
其中21ωω和是频域变量,单位是弧度/采样单元。
函数),(21ωωf 为函数),(n m f 的频谱。
二维傅里叶反变换的定义为21212121),(),(ωωωωωωπ
πωππωd d e e f n m f n j m j ⎰⎰-=-==
因此,函数),(n m f 可以用无数个不同频率的复指数信号的和表示,在频率),(21ωω处复指数信号的幅度和相位为),(21ωωf
MATLAB 提供的快速傅里叶变换函数
1)fft2:用于计算二维快速傅里叶变换,其语法格式为
b=fft2(I),返回图像I 的二维傅里叶变换矩阵,输入图像I 和输出图像B 大小相同;
b=fft2(I,m,n),通过对图像I 剪切或补零,按用户指定的点数计算二维傅里叶变换,返回矩阵B 的大小为m ⨯n 。
很多MATLAB 图像显示函数无法显示复数图像,为了观察图像傅里叶变换后的结果,应对变换后的结果求模,方法是对变换结果使用abs 函数。
2)fftn :用于计算n 维快速傅里叶变换,其语法格式为
b=fftn(I),计算图像的n 维傅里叶变换,输出图像B 和输入图像I 大小相同; b=fftn(I, size),通过对图像I 剪切或补零,按size 指定的点数计算n 维傅里叶变换,返回矩阵B 的大小为size 。
3) fftshift :用于将变换后的图像频谱中心从矩阵的原点移到矩阵的中心,其语法格式为
b=fftshift(I),将变换后的图像频谱中心从矩阵的原点移到矩阵的中心。
2、快速傅里叶变换的应用
1)滤波器频率响应
滤波器冲击响应的傅里叶变换就是该滤波器的频率响应
MATLAB提供的freqz2函数可以同时计算和显示滤波器的频率响应,其语法格式为
freqz2(h),可同时计算和显示滤波器的频率响应。
2)快速卷积
傅里叶变换的另一个重要特性是能够实现快速卷积。
由线性系统理论可知,两个系统卷积的傅里叶变换等于两个函数的傅里叶变换的乘积。
该特性与快速傅里叶变换一起,可以快速计算函数的卷积。
假设A为M⨯N矩阵,B为P⨯Q矩阵,则快速计算卷积的方法如下
①对A和B补0,使其大小都为(M+P-1)⨯(N+Q-1);
②利用函数fft2对矩阵进行二维FFT变换;
③将两个FFT结果相乘,利用函数ifft2对得到的乘积进行傅里叶反变换
另外,利用MATLAB 提供的卷积函数conv2可以直接对两个函数进行卷积,其语法格式为
C=conv2(A,B),计算矩阵A和B的二维卷积。
三、总体方案设计
1、加载imdemos saturn2文件,显示文件中的图像saturn2, 并对其进行傅里叶变换,给出源程序及结果,并显示其幅值的结果。
2、对矩阵A=magic(3)和B=ones(3)按照快速计算卷积的方法计算两个矩阵的卷积,并用卷积函数conv2验证结果给出源程序及结果。
四、主要参数
load 加载文件命令
fft2 用于计算二维快速傅里叶变换
fftshift 用于将变换后的图像频谱中心从矩阵的原点移到矩阵的中心
imshow 显示图像命令
abs 求幅度命令
plot 是绘制二维图形的最基本函数
ifft2 傅里叶反变换
conv2 卷积函数
五、源程序
1、加载imdemos saturn2文件,显示文件中的图像saturn2, 并对其进行傅里叶变换,给出源程序及结果,并显示其幅值的结果。
源程序如下:
>> load imdemos saturn2
>> imshow (saturn2)
>> a=fft2(saturn2);
>> b=fftshift(a);
>> c=abs(b);
>> imshow(log(c),[])
>> plot(c)
2、对矩阵A=magic(3)和B=ones(3)按照快速计算卷积的方法计算两个矩阵的卷积,并用卷积函数conv2验证结果给出源程序及结果。
源程序如下:
>> A=magic(3);
>> B=ones(3);
>> A(5,5)=0;
>> B(5,5)=0;
>> ifft2(fft2(A).*fft2(B))
>> A=magic(3);
>> B=ones(3);
>> conv2(A,B)
六、仿真结果
1、加载imdemos saturn2文件,显示文件中的图像saturn2, 并对其进行傅里叶变换,给出源程序及结果,并显示其幅值的结果。
>> load imdemos saturn2
>> imshow(saturn2)
a=fft2(saturn2);
b=fftshift(a);
c=abs(b);
imshow(log(c),[])
>> plot(c)
2、对矩阵A=magic(3)和B=ones(3)按照快速计算卷积的方法计算两个矩阵的卷积,并用卷积函数conv2验证结果给出源程序及结果。
源程序如下:
方法一
>> A=magic(3)
A =
8 1 6
3 5 7
4 9 2
>> B=ones(3)
B =
1 1 1
1 1 1
1 1 1
>> A(5,5)=0,B(5,5)=0
A =
8 1 6 0 0
3 5 7 0 0
4 9 2 0 0
0 0 0 0 0
0 0 0 0 0
B =
1 1 1 0 0
1 1 1 0 0
1 1 1 0 0
0 0 0 0 0
0 0 0 0 0
>> c=ifft2(fft2(A).*fft2(B))
c =
8.0000 9.0000 15.0000 7.0000 6.0000 11.0000 17.0000 30.0000 19.0000 13.0000 15.0000 30.0000 45.0000 30.0000 15.0000 7.0000 21.0000 30.0000 23.0000 9.0000 4.0000 13.0000 15.0000 11.0000 2.0000
方法二
A=magic(3),B=ones(3)
A =
8 1 6
3 5 7
4 9 2
B =
1 1 1
1 1 1
1 1 1
>> d=conv2(A,B)
d =
8 9 15 7 6
11 17 30 19 13
15 30 45 30 15
7 21 30 23 9
4 13 1
5 11 2
七、设计总结。