这学期选了《图像工程基础》这门课,课上老师留了一个作业:对图像进行二维傅里叶变换。
现在我使用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,[]),那么均可以正确显示图像
结果: