图像的频域操作&离散傅立叶变换的实现

图像的频域操作&离散傅立叶变换的实现
图像的频域操作&离散傅立叶变换的实现

图像的频域操作&离散傅立叶变换的实现
4.1.1 一维离散傅立叶变换的实现:
傅立叶变换函数:fft函数
语法格式:Y=fft(X,n,dim)
相应逆变换函数:ifft函数
语法格式:Y=ifft(X,n)
例:一维傅里叶变换的实现:

Fs=1000;%采样频率
T=1/Fs;%采样周期
L=1000;%信号长度
t=(0:L-1)*T;%时间向量
%构造有两个主要频率的合成含噪信号
S=0.7*sin(2*pi*50*t)+sin(2*pi*120*t);
X=S+2*randn(size(t));
%进行快速傅里叶变换
Y=fft(X);
P2=abs(Y);
plot(P2(1:end/2));

图像的频域操作&离散傅立叶变换的实现

4.1.2 二维离散傅里叶变换的实现
傅立叶变换函数:fft2函数
语法格式:Y=fft2(X,m,n)
相应逆变换函数:ifft2函数
语法格式:Y=ifft(X,m,n)

%创建一个256*256的零矩阵
f=zeros(256,256);
f(30:144,78:102)=1;
%显示图像
imshow(f);
%对矩阵进行DFT变换
F=fft2(f);
%计算每个元素的幅度
S=abs(F);
%显示变换后的图像
figure,imshow(S,[]);
%用log变换降低频谱的动态范围
F2=log(S);
%显示变换后的图像
figure,imshow(F2,[-1,5]);
%将变换原点移动到频域矩阵的中心
Fc=fftshift(F);
%显示变换后的图像
figure,imshow(Fc,[]);
%用log变换增强可见谱
S2=log(1+abs(Fc));
%显示变换后的图像
figure,imshow(S2,[]);

图像的频域操作&离散傅立叶变换的实现

图像的频域操作&离散傅立叶变换的实现
图像的频域操作&离散傅立叶变换的实现
图像的频域操作&离散傅立叶变换的实现
图像的频域操作&离散傅立叶变换的实现
4.1.3 相角的计算:需要能够在整个区间范围内计算反正切(具有这一特性的函数叫4象限正切),matlab函数atan2函数执行这一计算
格式:phi=atan2(I,k)
如atan2(1,1);atan2(1,-1);atan2(-1,-1)结果分别是45度,135度,-135度
在实践中,我们可写成前边的表达式
4.1.4 快速卷积的离散傅立叶变换实现

A=[1 2 3;4 5 6;7 8 9];
B=ones(3);
%扩展矩阵维数
A(8,8)=0;
B(8,8)=0;
%对A,B进行傅里叶变换
C=fft(A);
D=fft(B);
%将傅立叶变换相乘并进行逆变换
E=ifft(C.*D);
%获取有效数据
E=E(1:5,1:5);
E=real(C)
E =

   12.0000   15.0000   18.0000         0         0         0         0         0
    3.8284    5.5355    7.2426         0         0         0         0         0
   -6.0000   -6.0000   -6.0000         0         0         0         0         0
   -1.8284   -1.5355   -1.2426         0         0         0         0         0
    4.0000    5.0000    6.0000         0         0         0         0         0
   -1.8284   -1.5355   -1.2426         0         0         0         0         0
   -6.0000   -6.0000   -6.0000         0         0         0         0         0
    3.8284    5.5355    7.2426         0         0         0         0         0

卷积运算在图像处理中的一个重要应用是模板匹配作用。具体算法是:以待定位目标为模板在待识别图像上滑动并进行匹配运算,并通过对运算结果取适当阀值确定目标位置。
例:利用傅里叶变换模板匹配目标

%读入识别图像
bw=imread('text.jpg');
a=bw(10:50,50:90);
imshow(bw);
title('原图,在这幅图中找出字母a的位置');
figure,imshow(a);
title('字母a');
%将字母a和待识别图像进行傅立叶变换并计算卷积
a(256,256)=0;
C=real(ifft2(fft(bw).*fft2(rot90(a,2),256,256)));
figure,imshow(c,[]);
%选取阀值进行目标定位
thresh=60;
%卷积运算的值大于60的输出为白色,小于的输出为黑色
figure,imshow(C>thresh);

4.2.1 DFT滤波的基本操作
(1)使用函数paddedsize获得填充函数.
PQ=paddedsize(size(f));
(2)得到使用填充函数的傅里叶变换.
F=fft2(f,PQ(1),PQ(2));
(3)生成一个PQ(1)*PQ(2)的滤波函数H.
(4)将变换乘以滤波函数:G=H.*F
(5)获得G的傅里叶逆变换的实部:g=read(ifft(G));
(6)将左上部的矩形修剪为原始大小
g=g(1:size(f,1),1:size(f,2));
4.2.2 用于频域滤波的M函数
这样的函数可接受输入图像和一个滤波函数,可处理所有滤波函数细节并输出经滤波和剪切后的图像。

function g=dftfilt(f,H)
F=fft2(f,size(H,1),size(H,2));
g=real(ifft2(H.*F));
g=g(1:size(f,1),1:size(f,2))

may(imread(‘text.jpg’), ones(5))

ans(:,:,1) =

240 240 241 242 243
237 236 237 238 239
236 236 236 236 238
231 230 229 230 231
221 220 218 218 219