概述
clc;
clear all;
img=imread('lena.jpg');
img_noise = imnoise(img, 'gaussian', 0, 0.01);
subplot(2,2,1),imshow(img_noise);
title('原图像');
% 将低频移动到图像的中心,这个也很重要
s=fftshift(fft2(img_noise));
subplot(2,2,3),imshow(log(abs(s)),[]);
title('图像傅里叶变换取对数所得频谱');
% 求解变换后的图像的中心,我们后续的处理是依据图像上的点距离中心点的距离来进行处理
[a,b] = size(img);
a0 = round(a/2);
b0 = round(b/2);
d = min(a0,b0)/12;
d = d^2;
for i=1:a
for j=1:b
distance = (i-a0)^2+(j-b0)^2;
if distance<d
h = 1;
else
h = 0;
end
low_filter(i,j) = h*s(i,j);
end
end
subplot(2,2,4),imshow(log(abs(low_filter)),[])
title('低通滤波频谱');
new_img = uint8(real(ifft2(ifftshift(low_filter))));
subplot(2,2,2),imshow(new_img,[])
title('低通滤波后的图像');
这是学习图像处理使用傅里叶变换做的一个低通滤波,虽然傅里叶变换很复杂,但是matlab直接调用fft和fft2这个确实很方便
s=fftshift(fft2(img_noise));
这句话实现的是将低频转移到图像的中间,因为采用fft2变换后的图像高频在中间,低频段分散到四个角落
[a,b] = size(img);
a0 = round(a/2);
b0 = round(b/2)
一开始我也没搞明白这是干嘛的,后来明白了就茅塞顿开,这是在求解图形的中心点,之后的距离计算和滤波都与这个点有关
for i=1:a
for j=1:b
distance = (i-a0)^2+(j-b0)^2;
if distance<d
h = 1;
else
h = 0;
end
low_filter(i,j) = h*s(i,j);
end
end
这里就是基于距离进行滤波,所谓低通就是把距离中心点近的值进行保留,那么同理高通就是把距离远的值保留,这里当然可以直接采用fft2变换之后的图像进行处理,这样应该更方便。至于什么带通带阻都是大同小异
最后展示一下结果
最后
以上就是明亮画板为你收集整理的matlab图像处理实现低通滤波的全部内容,希望文章能够帮你解决matlab图像处理实现低通滤波所遇到的程序开发问题。
如果觉得靠谱客网站的内容还不错,欢迎将靠谱客网站推荐给程序员好友。
本图文内容来源于网友提供,作为学习参考使用,或来自网络收集整理,版权属于原作者所有。
发表评论 取消回复