用MATLAB的函数fft2()作二维傅里叶变换所需要注意的地方(二维傅里叶变换的物理意义、im2double、fftshift、abs、imshow)

先说“二维傅里叶变换的物理意义”。二维傅里叶变换用于求二维矩阵的频谱,我们图像的一个通道便是一个二维矩阵。

先上使用MATLAB作二维傅里叶变换的代码。

%该程序用于说明使用MATLAB作二维傅里叶变换所需要知道的东西
%作者微信/QQ 2487872782
%有问题可以联系作者交流
%图像处理技术交流QQ群 271891601

I=imread('coins.png');%coins.png是MATLAB自带的图像
F=fft2((im2double(I)));
F=fftshift(F);
F=abs(F);
T=log(F+1);

subplot(1,2,1);
imshow(F,[]);
title('未经变换的频谱');

subplot(1,2,2);
imshow(T,[]);
title('对数变换后');

运行结果如下:

 下面对上面代码中需要注意的地方进行说明:

1 语句“F=fft2((im2double(I)));”
说明:作二维傅里叶变换前一定要用函数“im2double()把”原始图像的数据类型由uint8转化为double类型,否则会因为unit8数据类型只能表示0~255的整数而出现数据截断,进而出现错误结果。关于这个问题,还可参考我的另一篇博文,链接https://blog.csdn.net/wenhao_ir/article/details/124154493

2 函数fftshift()是对函数fft2()作傅里叶变换后得到的频谱进行平移,具体来说是将频率的零频点移到频谱的中间,如果要完全搞清楚为什么要对频谱进行平谱以及其中具体的数学原理,那就要开专门的文章来写了,等以后我写了专门的文章再把链接添加到这里。大家可以暂时参考下我的另一篇博文,链接 https://blog.csdn.net/wenhao_ir/article/details/51689960 和其他人写的博文:https://www.cnblogs.com/limanjihe/p/10014142.html

3 语句“F=abs(F);”  这个语句求得的是频谱的幅度。

4 为什么要对频谱幅度作对数变换?答:这是为了拉伸对比度,使得我们能更直观地观察频谱分布情况。

5 imshow(F,[]);如果F是二维矩阵,则显示的是灰图像,后面的参数[]在这里是必须要的,加上的话会对数据做归一化处理再显示。经过运算得到的图像,如果不作这个处理的话,那显示的结果很容易不符合我们的预期甚至就是错误的显示。比如,如果运算后很多数据都是超过255的,那么最后显示的结果就是整个图像的大部分都是白色的;又如,如果数据的范围集中在0.1到0.2之间,那显示出的图像几乎就没有对比度。关于imshow()的使用,还可以参考我的另一篇博文,链接https://blog.csdn.net/wenhao_ir/article/details/124168818

猜你喜欢

转载自blog.csdn.net/wenhao_ir/article/details/51037744