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

  这学期选了《图像工程基础》这门课,课上老师留了一个作业:对图像进行二维傅里叶变换。

  现在我使用matlab解决这个问题

 1.实验基本指令

首先我试了一下matlab图像处理的基本指令

原图:

经过以下指令后

将图片导入matlab后,命名为ini,经过以下指令后,图片变为

ini(:,:,1)=0;
ini(:,:,2)=0;
imshow(ini);

 

2.进行二维傅里叶变换

仍然以上文的图片为例(在我的文件夹中这张图片名为'千反田2.jpg')

前置代码:

ini=imread('千反田2.jpg');
iniGray=rgb2gray(ini);
iniDouble=im2double(iniGray);
  • ini矩阵是720*1280*3的矩阵,其中720*1280是图片的尺寸(像素点),3是RGB数值(一共有三层)
  • iniGray是将原图像灰度化后的矩阵,720*1280
  • iniDouble则是将iniGray归一化后的矩阵,720*1280

如图是iniGray矩阵的值(一部分)

 

以下是iniDouble(部分)

 

注:

在实验过程后,我将iniDouble整个矩阵乘以255后,可以发现iniGray与iniDouble矩阵是完全相同的

iniDouble=iniDouble*255;

这说明,im2Double()这个过程的算法,不过是把灰度矩阵的数据全部除以255;

实际上,如果不使用im2Double这个命令,后面的步骤仍然可以继续进行。

 

 

 

 

 

 

 

进行fftshift后:

 

 

 

整体代码:

ini=imread('千反田2.jpg');
iniGray=rgb2gray(ini);
iniDouble=im2double(iniGray);
iniFFT=fft2(iniDouble);
iniShift=fftshift(iniFFT);
iniAbs=abs(iniShift);
iniT=log(iniAbs+1);
imshow(iniT,[]);

取对数原因:

iniAbs矩阵中,数的范围大致在0~500000之间,靠近500000的值实际上非常少,大部分<10,这样,如果进行绘图imshow(iniAbs,[]),会导致整个图像基本是黑的,因为imshow(iniT,[])命令把最大的那个值(接近500000)当作白色,而矩阵中的其他部分全部被划为灰度值十分接近0的黑色。

而在取对数后,iniT的值大致局限在了[0,13]。因为对数的增长十分缓慢,所以对数化后的矩阵的矩阵各个值之间的差变小了

imshow(iniT,[])命令把13当作白色,而接近13的数比较多,所以导致图像不会几乎全黑,能够直观显示

 

画图命令使用imshow(iniT,[])而不是imshow(iniT)的原因:

imshow(iniT)只使用iniT矩阵中值在[0,1]之间的部分,而iniT实际上大致在[0,13]之间,所以不能正确显示图像。如果使用imshow(iniT/13)或者imshow(iniT,[]),那么均可以正确显示图像

 

 

 

结果:

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

  • 14
    点赞
  • 49
    收藏
    觉得还不错? 一键收藏
  • 2
    评论
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值