ButterWorth滤波器学习(参照博主链接——https://blog.youkuaiyun.com/cjsh_123456/article/details/79342300,非常感谢!),仅作个人学习记录
因为实验需要,需要了解该滤波器相关内容,参照该博主实验了他的以下代码——
函数代码:
function [image_out] = Bfilter(image_in, D0, N)
% Butterworth滤波器,在频率域进行滤波
% 输入为需要进行滤波的灰度图像,Butterworth滤波器的截止频率D0,阶数N
% 输出为滤波之后的灰度图像
[m, n] = size(image_in);
P = 2 * m;
Q = 2 * n;
fp = zeros(P, Q);
%对图像填充0,并且乘以(-1)^(x+y) 以移到变换中心
for i = 1 : m
for j = 1 : n
fp(i, j) = double(image_in(i, j)) * (-1)^(i+j);
end
end
% 对填充后的图像进行傅里叶变换
F1 = fft2(fp);
% 生成Butterworth滤波函数,中心在(m+1,n+1)
Bw = zeros(P, Q);
a = D0^(2 * N);
for u = 1 : P
for v = 1 : Q
temp = (u-(m+1.0))^2 + (v-(n+1.0))^2;
Bw(u, v) = 1 / (1 + (temp^N) / a);
end
end
%进行滤波
G = F1 .* Bw;
% 反傅里叶变换
gp = ifft2(G);
% 处理得到的图像
image_out = zeros(m, n, 'uint8');
gp = real(gp);
g = zeros(m, n);
for i = 1 : m
for j = 1 : n
g(i, j) = gp(i, j) * (-1)^(i+j);
end
end
mmax = max(g(:));
mmin = min(g(:));
range = mmax-mmin;
for i = 1 : m
for j = 1 : n
image_out(i,j) = uint8(255 * (g(i, j)-mmin) / range);
end
end
end
脚本代码:
clear all;
close all;
clc;
image1 = imread('C:\1.bmp');
image1 = rgb2gray(image1)
image2 = Bfilter(image1, 10, 2);
image3 = Bfilter(image1, 30, 2);
image4 = Bfilter(image1, 60, 2);
image5 = Bfilter(image1, 160, 2);
image6 = Bfilter(image1, 460, 2);
% 显示图像
subplot(2,3,1), imshow(image1), title('原图像');
subplot(2,3,2), imshow(image2), title('D0 = 10, n = 2');
subplot(2,3,3), imshow(image3), title('D0 = 30, n = 2');
subplot(2,3,4), imshow(image4), title('D0 = 60, n = 2');
subplot(2,3,5), imshow(image5), title('D0 = 160, n = 2');
subplot(2,3,6), imshow(image6), title('D0 = 460, n = 2');
使用的图像为1.bmp
对比该博主文章中的脚本代码,我多了一行代码(即image1 = rgb2gray(image1) %将彩图转为灰度图),这是应为我使用的是三维彩色图片,否则运行结果如下——