# 在使用matlab完成课程作业的时候要求设计一个巴特沃斯低通滤波器,其中提到了振铃效应。
首先介绍一下这个滤波器(BLPF),巴特沃斯低通滤波器与理想低通滤波器相似,但是它引入了阶数参数 n。该参数决定了滤波器的“软硬”程度。阶数越高,滤波器越陡峭,过渡带越窄,因此滤波器的截止频率附近有更少的振铃效应。
注意这个转移函数的分母里面是1+[ D(u,v) / D0 ]^2n
巴特沃斯高通滤波器的转移函数分母里面是1+[ D0 / D(u,v) ]^2n
另外,在信号处理中,特别是数位影像处理 ,振铃效应是一种出现在信号快速转换时,附加在转换边缘上导致失真的信号。而在图像或影像上,振铃效应会导致出现在边缘附近的环带或像是“鬼影”的环状伪影,称为振铃伪像[1](ringing artifact);在音讯中,振铃效应会导致出现在短暂音附近的回声,特别是由打击乐器发出的声音;最容易注意到的是预回声。使用“振铃”这一个词则是因为输出信号在输入信号快速转换的边缘附近出现一有一定衰减速度的振荡,这个现象相似于钟被敲击之后发出声音的过程。振铃效应就如同其他的失真一样,他们的最小化在滤波器设计中是很重要的一项指标。
提一下高斯低通滤波器:
高斯低通滤波器的设计基于高斯分布函数。它具有连续性和光滑性,没有理想低通滤波器和巴特沃斯低通滤波器的振铃效应。高斯滤波器通过控制方差来调节频率域的衰减速度。
在 MATLAB 中,我们首先创建一个二维的高斯分布函数,其中心为图像中心,方差与截止频率相关。然后将该函数应用于频域图像,即可得到高斯低通滤波器。
MATLAB 语法中,二维数组的创建使用 zeros()
函数或 ones()
函数,通过遍历每个像素点计算距离并进行滤波器值的设定。对于循环操作,MATLAB 提供了 for
循环结构,用于迭代遍历数组中的每个元素。
这里贴一下本次作业这部分的代码
% 作者: 你猜不到我是谁
% 编辑时间: 2024-04-10
% 描述:完成第三次实验第二部分平滑频域滤波:
% (1)设计理想低通滤波器、巴特沃斯低通滤波器和高斯低通滤波器,截止频率自选。
% (2)读出图像,加入椒盐躁声,分别采用上题设计的理想低通滤波器、巴特沃斯低通滤波器和指数型低通滤波器对其进行滤波,再做逆变换得到低通滤波后的空域图像。
% 观察不同的截止频率下采用不同低通滤波器得到的图像与原图像的区别,特别注意振铃效应。
clc;close all;clear;
im = imread('room.png');
im = im2double(im); % 转换为 double 类型
% 设置截止频率
cutoff_frequency = 0.1;
% 创建理想低通滤波器
[M, N] = size(im);
ideal_lowpass_filter = zeros(M, N);
center_x = floor(M/2) + 1;
center_y = floor(N/2) + 1;
for i = 1:M
for j = 1:N
distance = sqrt((i - center_x)^2 + (j - center_y)^2);
if distance <= cutoff_frequency * sqrt(M^2 + N^2)
ideal_lowpass_filter(i, j) = 1;
end
end
end
% 创建巴特沃斯低通滤波器
n = 2; % 巴特沃斯滤波器阶数
butterworth_lowpass_filter = zeros(M, N);
for i = 1:M
for j = 1:N
distance = sqrt((i - center_x)^2 + (j - center_y)^2);
butterworth_lowpass_filter(i, j) = 1 / (1 + (distance / (cutoff_frequency * sqrt(M^2 + N^2)))^(2*n));
end
end
% 创建高斯低通滤波器
[X, Y] = meshgrid(1:N, 1:M);
gaussian_lowpass_filter = exp(-((X-center_x).^2 + (Y-center_y).^2) / (2*(cutoff_frequency * sqrt(M^2 + N^2))^2));
% im = imread('room.png');
% im = im2double(im); % 转换为 double 类型
[M, N] = size(im);
% 添加椒盐噪声
noise_density = 0.05; % 噪声密度
salt_pepper = rand(M, N);
im(salt_pepper < noise_density/2) = 0; % 椒噪声
im(salt_pepper > 1 - noise_density/2) = 1; % 盐噪声
% 进行傅里叶变换
im_fft = fftshift(fft2(im));
% 应用滤波器
filtered_im_fft_ideal = im_fft .* ideal_lowpass_filter;
filtered_im_fft_butterworth = im_fft .* butterworth_lowpass_filter;
filtered_im_fft_gaussian = im_fft .* gaussian_lowpass_filter;
% 进行逆傅里叶变换
filtered_im_ideal = real(ifft2(ifftshift(filtered_im_fft_ideal)));
filtered_im_butterworth = real(ifft2(ifftshift(filtered_im_fft_butterworth)));
filtered_im_gaussian = real(ifft2(ifftshift(filtered_im_fft_gaussian)));
% 显示滤波后的图像
figure;
subplot(2, 2, 1), imshow(im), title('原始图像');
subplot(2, 2, 2), imshow(filtered_im_ideal), title('理想低通滤波器');
subplot(2, 2, 3), imshow(filtered_im_butterworth), title('巴特沃斯低通滤波器');
subplot(2, 2, 4), imshow(filtered_im_gaussian), title('高斯低通滤波器');
参考: