问题
在进行语音、图像、光学成像相关的实验时,可能需要用到低通滤波器或高通滤波器。
解决
以方形滤波器和圆形高低通滤波器为例,直接上代码!!!带通滤波器只需要根据代码加个外径即可,而特殊形状的滤波器可以参考我的另一篇经验分享。
1、圆形滤波器(可以利用循环和k值创建不同孔径的圆形滤波器)
clc;clear;set(0,'defaultfigurecolor','w'); % 将画布默认底色改为白色
[f,map] = imread('...\Origin_Picture.jpg'); % 读取原始图片
f = rgb2gray(f); % 将三通道RGB图片转为灰度图
[m,n] = size(f); % 读取图片尺寸
F = fftshift(fft2(double(f))); % 傅里叶变换
d0 = 20; % 设置滤波器频段
flag = 1; % 高低通滤波器选择(1为低通)
H = ones(m,n); %全通滤波器矩阵
for k = 0:2
for u = 1:m
for v = 1:n
d = sqrt((u-0.5*m-1).^2+(v-0.5*n-1).^2); %以矩阵中心为圆心绘制圆孔
if flag == 1 %低通滤波器
if d <= d0+40*k %不同孔径的圆形滤波器,步长40
H(u,v) = 1;
H(u,v) = double(H(u,v));
else
H(u,v) = 0;
H(u,v) = double(H(u,v));
end
else %高通滤波器
if d <= d0+40*k %不同孔径的圆形滤波器,步长40
H(u,v) = 0;
H(u,v) = double(H(u,v));
else
H(u,v) = 1;
H(u,v) = double(H(u,v));
end
end
end
end
end
G=H.*F; %进行滤波
2、方形滤波器
clc;clear;
f=imread('...\new.bmp');
f=rgb2gray(f);
[m,n]=size(f);
figure(1),subplot(2,3,1),imshow(f);xlabel('原图像');
F=fftshift(fft2(double(f)));
H=zeros(m,n);
for u=1:m
for v=1:n
d0=50;
if ((m/2-d0)<=u)&& (u<=(m/2+d0)) && ((n/2-d0)<=v)&&(v<=(n/2+d0)
H(u,v)=1;
H(u,v)=double(H(u,v));
else
H(u,v)=0;
H(u,v)=double(H(u,v));
end
end
end
G=H.*F;
希望我的分享可以帮到你!!!