matlab 实现图像处理频域滤波傅⾥叶变换含代码
频域滤波步骤:
1.给定⼤⼩为的输⼊图像,将其填充为⼤⼩的图像其中。填充⽅法为:在M,N 的后⾯添加0(尾部加0)。设经过此步骤的图像为
进⾏第⼀步的原因(下⾯卷积公式应为f(m)):
如图,相当于对h(m)关于y轴对称之后向右不断平移x,并求其和f(m)的乘积。如果对称之后,h(m)的图像与h(x) or f(x)有重叠,就会产⽣
混叠,影响结果。
2.对图像×,将其移到变换中⼼
M ×N P ×Q P =2M ,Q =2N f (x ,y )
p (−1)x +y
进⾏第⼆步的原因:
如图,进⾏运算之后在内是完整的⼀个周期,便于DFT
3.计算步骤⼆之后获得的图像(矩阵)的DFT
就直接套公式就完事了
matlab求傅里叶变换4.⽣成⼀个实的,对称的滤波函数H(u,v),其⼤⼩为P×Q ,中⼼在(P/2,Q/2)处,G(u,v) = H(u,v).*F(u,v)
[0,M −1]F (u ,v )=
f (x ,y )e ∑x =0M −1∑y =0N −1−2πj (+)M ux N vy
要注意滤波函数的⽣成⼤⼩,低通滤波器可以⽤
%D(u,v)<=D0时有值
u = 0:Q-1
v = 0:P-1
%calculate D(u,v)
H = double(D<=D0)
控制滤波器的⼤⼩
5.对G进⾏傅⾥叶反变换,得到g(x,y),并对其取实部,乘(-1)^(x+y)其实取abs实际感觉差别不是很⼤
6.从g(x,y)上提取M*N的部分得到最终结果。
下⾯是代码实现
%matlab调库
function [DFT_img] = FFT_(I,H)
%调⽤FFT库函数实现频域滤波
%输⼊ I为图像f(x,y),H为滤波器H(u,v)
%输出滤波后的图像g(x,y)
%在不严谨的情况下我们可以不做扩展0,结果仍然与正确结果差不多
F = fft2(I);
Fs = fftshift(F);
out = H.*Fs;
out=ifftshift(out);
out=ifft2(out);
out=real(out);%⽤abs基本没区别
out=out/max(out(:));%除以out中最⼤值
DFT_img = out;
end
%以低通滤波为例
path = 'your own path';
I = imread(path);
M = size(I,2);
N = size(I,1);
u=0:M-1;
v=0:N-1;
[U,V]=meshgrid(u,v);%基于向量 x 和 y 中包含的坐标返回⼆维⽹格坐标
D=sqrt((U-M/2).^2+(V-N/2).^2);
D0=15;%截⽌频率
H=double(D<=D0);%理想低通滤波器
n = FFT_(I,H)
imshow(n,[])%不加[]效果相同
原图:
低通滤波以后(D0=15):
版权声明:本站内容均来自互联网,仅供演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系QQ:729038198,我们将在24小时内删除。
发表评论