本文主要是介绍图像的频域滤波-低通滤波,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!
图像的频域滤波-低通滤波
1.理想低通滤波
介绍
如图,通带内留下,阻带内直接干掉。
效果
- 理想低通最大的缺点就是会产生振铃效应,从滤波后结果的图片就可以发现(有一圈圈波纹的感觉)。
实例代码
clc;
clear all;
close all;
%理想低通滤波器所产生的模糊和振铃现象
I=imread('lena.jpg');
if size(I, 3)==3I = rgb2gray(I);
end
subplot(3,3,1);imshow(I);xlabel('(a)原始图像');
I=double(I);
%采用傅里叶变换
f=fft2(I);
g0=fftshift(f);
subplot(3,3,2);imshow(log(1+abs(g0)), []);xlabel('(b)频谱图像');%color(jet(64));
[M,N]=size(f);
n1=floor(M/2);
n2=floor(N/2);% d0=5, 15, 45, 65 理想低通的截取半径
d0=5;
for i=1:Mfor j=1:Nd=sqrt((i-n1)^2+(j-n2)^2);if d<=d0 %列出传递函数h=1;elseh=0;endg1(i,j)=h*g0(i,j);end
end
g1=ifftshift(g1);%频谱变回左上角为直流分量的形式
g1=uint8(real(ifft2(g1)));
subplot(3,3,3);imshow(g1);xlabel('(c)被滤掉10%高频能量')d1=15;
for i=1:Mfor j=1:Nd=sqrt((i-n1)^2+(j-n2)^2);if d<=d1h=1;elseh=0;endg2(i,j)=h*g0(i,j);end
end
g2=ifftshift(g2);
g2=uint8(real(ifft2(g2)));
subplot(3,3,4);imshow(g2);
xlabel('(d)被滤掉3.6%高频能量')d2=45;
for i=1:Mfor j=1:Nd=sqrt((i-n1)^2+(j-n2)^2);if d<=d2h=1;elseh=0;endg3(i,j)=h*g0(i,j);end
end
g3=ifftshift(g3);
g3=uint8(real(ifft2(g3)));
subplot(3,3,5);imshow(g3);
xlabel('(e)被滤掉1%高频能量')d3=65;
for i=1:Mfor j=1:Nd=sqrt((i-n1)^2+(j-n2)^2);if d<=d3h=1;elseh=0;endg4(i,j)=h*g0(i,j);end
end
g4=ifftshift(g4);
g4=uint8(real(ifft2(g4)));
subplot(3,3,6);imshow(g4);
xlabel('(f)被滤掉0.6%高频能量')
巴特沃兹低通滤波
介绍
- 巴特沃兹低通滤波器实现了通阻带的平稳过渡。因此,滤波后没有明显振铃现象的产生。
效果图
示例代码
clc;
clear all;
close all;
I1=imread('lena.jpg'); % 读入图像
if size(I1, 3)==3I1 = rgb2gray(I1);
end
subplot(2,2,1),imshow(I1); % 显示原始图像
xlabel('(a) 原始图像');
f=double(I1); % 数据类型转换
g=fft2(f); % 图像傅立叶转换
g=fftshift(g); % 傅立叶变换平移
F2 = log(1+abs(g)); % 对傅立叶变换结果取绝对值,然后取对数
subplot(2,2,2),imshow(F2,[]); % 将计算后的矩阵用图像表示
xlabel('(b) 原始图像的傅里叶变换图像');[N1,N2]=size(g); % 傅立叶变换图像尺寸
n=2; % 参数赋初始值
d0=5; % 参数赋初始值
n1=fix(N1/2); % 数据圆整
n2=fix(N2/2); % 数据圆整
for i=1:N1 % 遍历图像像素
for j=1:N2d=sqrt((i-n1)^2+(j-n2)^2);if d==0h=0; % 求helseh=1/(1+(d/d0)^(2*n)); % 巴特沃兹低通的幅频响应endresult(i,j)=h*g(i,j); % 图像矩阵计算处理
end
end
F3 = log(1+abs(result)); % 对傅立叶变换结果取绝对值,然后取对数
subplot(2,2,3),imshow(F3); % 将计算后的矩阵用图像表示
xlabel('(c) 滤波后的傅里叶变换图像')result=ifftshift(result); % 傅立叶变换平移
X2=ifft2(result); % 图像傅立叶逆变换
X3=uint8(real(X2)); % 数据类型转换
subplot(2,2,4),imshow(X3) % 显示处理后的图像
xlabel('(d) Butterworth低通滤波图像');
这篇关于图像的频域滤波-低通滤波的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!