使用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,[]),那么均可以正确显示图像

结果:

发布了29 篇原创文章 · 获赞 6 · 访问量 3419

猜你喜欢

转载自blog.csdn.net/qq_42138454/article/details/101073339