MATLAB作二维傅里叶变换所需要注意和知道的东西(im2double、fft2、abs、imshow、二维傅里叶变换的物理意义)

图像处理开发资料、图像处理开发需求、图像处理接私活挣零花钱,可以搜索公众号"qxsf321",并关注!
图像处理开发资料、图像处理开发需求、图像处理接私活挣零花钱,可以搜索公众号"qxsf321",并关注!
图像处理开发资料、图像处理开发需求、图像处理接私活挣零花钱,可以搜索公众号"qxsf321",并关注!

-----------------------------------------------

代码如下,这个代码是实现灰度图像作二维傅里叶变换后的非线性变换哈~

 

clear all;
I=imread('coins.png');
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)));  作二维傅里叶变换前一定要先把用imread读到的数据原始图像的数据类型由uint8转化为double类型!
2 fftshift是对MATLAB作傅里叶变换后的数据的零频点移到频谱的中间,具体的作用你看下面的代码的运行结果即可:
代码下载链接:http://pan.baidu.com/s/1jIfGM2a 密码:iqxt
 MATLAB作二维傅里叶变换所需要注意和知道的东西(im2double、fft2、abs、imshow、二维傅里叶变换的物理意义)_第1张图片
原信号是:
x=0.5*sin(2*pi*15*t)+2*sin(2*pi*40*t);
可见,信号的频率是15Hz和40Hz,15Hz的幅度是0.5,40Hz的幅度是2,我们看到中间的那个蓝色频谱图,因为没有经过fftshift,那完全就是错的!所以为啥要用fftshift呢?根本原因就是MATLAB在作傅里叶变换时它没有负频率啊!它的频率范围是0到采样频率啊!具体到二维的图像傅里叶变换的意义可以参考下面这幅图:
 MATLAB作二维傅里叶变换所需要注意和知道的东西(im2double、fft2、abs、imshow、二维傅里叶变换的物理意义)_第2张图片
3 F=abs(F); 这个模实际上就是欧拉距离,实际上就是根号下[(x1-x2)^2+(y1-y2)^2]!

 

4 imshow(F,[]);如果F是二维矩阵,则显示的是灰度或二值图像,后面的参数[]在这里是必须要的,加上的话会对数据做归一化处理再显示,如果不作这个处理的话,你想,如果数据跨度比较大,那么有很多数据都是超过255的,那么最后的结果就是整个图片的大部分范为都是白的,你可以想像一下,其实是很容易想到的!

-----------------------------------------------

你可能感兴趣的:(图像处理与识别算法原理)