DFT:discrete Fouriter Transform离散傅立叶变换
傅立叶表换具有唯一性。傅立叶变换揭示了信号的时域特性和频域特性之间的确定的内在联系。
在图像里面时域特性表现为空域特性。
一个例子
下面是用傅立叶与逆傅立叶变换操作图像
% 下面求图像的傅立叶变换频谱
f=imread('E:\资料\onedrive\code\test\image\Fig0403(a)(image).tif');
F=fft2(f);
S=abs(F); % 去F的频谱
w=2;h=3;i=0;
i=i+1;subplot(w,h,i);imshow(f,[]);
i=i+1;subplot(w,h,i);imshow(S,[]);
% imshow(K)与imshow(K,[])的区别;
% imshow(K)直接显示K;
% imshow(K,[])显示K,并将K的最大值和最小值分别作为纯白(255)和纯黑(0),中间的K值映射为0到255之间的标准灰度值。
%fftshift移动零频点到频谱中间,重新排列fft,fft2和fftn的输出结果。
Fc = fftshift(F);
i=i+1;subplot(w,h,i);imshow(abs(Fc),[]);
%log变换将像素范围压缩;
S2=log(1+abs(Fc));
i=i+1;subplot(w,h,i);imshow(S2,[]);
f=real(ifft2(F));% 逆傅立叶变换;逆变换后取得实部就好
%这次变换中傅立叶变换后没有做什么操作,所以逆傅立叶变换后还是原来的结果;
i=i+1;subplot(w,h,i);imshow(f,[]);
显示的优化
从上面的代码我们看到,在一个窗口输出多个图片,需要自己设置位置什么的,但是刚开始我们不知道最终要显示多少行多少列的图片,而且随着图片的增加需要经常修改显示的参数。同时如果调换显示顺序和插入显示都需要调整很多代码,基于这些不便,我自己写了个imshow函数。程序会一直保存你要输出的图像,直到输入0,把图像全部输出出来,同时能够实现自适应。
function myImshow(img)
persistent myNumOfImg %记录最终需要的图片个数;
persistent M %记录所有的图片
if isempty(myNumOfImg)
myNumOfImg=0;
M=cell(5);
end
if isequal(img,0) %表示结束
h=ceil(sqrt(myNumOfImg)); %宽
w=ceil(myNumOfImg*1.0/h); %高
for i=1:myNumOfImg
subplot(w,h,i);
imshow(M{i},[]);
end
else
myNumOfImg=myNumOfImg+1;
M{myNumOfImg}=img;
end
运行示例
clear all;
close all;
f=imread('E:\资料\onedrive\code\test\image\Fig0403(a)(image).tif');
F=fft2(f);
S=abs(F); % 去F的频谱
myImshow(f);
myImshow(S);
%fftshift移动零频点到频谱中间,重新排列fft,fft2和fftn的输出结果。
Fc = fftshift(F);
% i=i+1;subplot(w,h,i);imshow(abs(Fc),[]);
myImshow(abs(Fc));
%log变换将像素范围压缩;
S2=log(1+abs(Fc));
% i=i+1;subplot(w,h,i);imshow(S2,[]);
myImshow(S2);
f=real(ifft2(F));% 逆傅立叶变换;
%这次变换中傅立叶变换后没有做什么操作,所以逆傅立叶变换后还是原来的结果;
myImshow(f);
myImshow(0);
运行结果
相关参考
http://yunniyu.blog.163.com/blog/static/22208431201261665217676
如何在matlab里面实现静态变量
matlab中cell的使用方法
这个说明可以使用cell来建立三维数组,低两维的维数可以不一样
matlab如何清空程序运行过程中产生的矩阵
因为这里我们的程序用到了静态变量,所以需要学会清空