matlab图像处理实现低通滤波

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变换之后的图像进行处理,这样应该更方便。至于什么带通带阻都是大同小异
最后展示一下结果
在这里插入图片描述

评论 12
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值