课后作业,实现“理想、巴特沃斯、高斯”高通低通滤波器。
代码基于Matlab实现。完整代码及处理结果见:GitHub
步骤
- 加载图像
- 中心化图像
- 傅里叶变换
- 与滤波器做运算(空域的卷积运算对应频域的乘法运算)
- 傅里叶反变换
- 裁剪图像
低通滤波器
理想低通滤波器
实现代码
close all;
clear all;
f = imread('cameraman.tif');
f = mat2gray(f,[0 255]);
[M,N] = size(f);
P = 2*M;
Q = 2*N;
fc = zeros(M,N);
for x = 1:1:M
for y = 1:1:N
fc(x,y) = f(x,y) * (-1)^(x+y);
end
end
F = fft2(fc,P,Q);
H_1 = zeros(P,Q);
H_2 = zeros(P,Q);
H_3 = zeros(P,Q);
for x = (-P/2):1:(P/2)-1
for y = (-Q/2):1:(Q/2)-1
D = (x^2 + y^2)^(0.5);
if(D <= 10) H_1(x+(P/2)+1,y+(Q/2)+1) = 1; end
if(D <= 50) H_2(x+(P/2)+1,y+(Q/2)+1) = 1; end
if(D <= 150) H_3(x+(P/2)+1,y+(Q/2)+1) = 1; end
end
end
G_1 = H_1 .* F;
G_2 = H_2 .* F;
G_3 = H_3 .* F;
g_1 = real(ifft2(G_1));
g_1 = g_1(1:1:M,1:1:N);
g_2 = real(ifft2(G_2));
g_2 = g_2(1:1:M,1:1:N);
g_3 = real(ifft2(G_3));
g_3 = g_3(1:1:M,1:1:N);
for x = 1:1:M
for y = 1:1:N
g_1(x,y) = g_1(x,y) * (-1)^(x+y);
g_2(x,y) = g_2(x,y) * (-1)^(x+y);
g_3(x,y) = g_3(x,y) * (-1)^(x+y);
end
end
%% -----show-------
figure();
subplot(2,2,1);
imshow(f,[0 1]);
xlabel('a).Original Image');
subplot(2,2,2);
imshow(g_1,[0 1]);
xlabel('b).Ideal_Lowpass/D0=10');
subplot(2,2,3);
imshow(g_2,[0 1]);
xlabel('c).Ideal_Lowpass/D0=50');
subplot(2,2,4);
imshow(g_3,[0 1]);
xlabel('d).Ideal_Lowpass/D0=150');
结果
可以看到D0的值越少,即允许用过的频率越低。高频信息损失越多,表现在图像上是边缘信息的丢失,看起来图像模糊。如图b。
巴特沃斯低通滤波器
这里只展示核心的滤波器实现代码。完整代码见GitHub
for x = (-P/2):1:(P/2)-1
for y = (-Q/2):1:(Q/2)-1
D = (x^2 + y^2)^(0.5);
D_0 = 10;
H_1(x+(P/2)+1,y+(Q/2)+1) = 1/(1+(D/D_0)^2);
D_0 = 50;
H_2(x+(P/2)+1,y+(Q/2)+1) = 1/(1+(D/D_0)^2);
D_0 = 150;
H_3(x+(P/2)+1,y+(Q/2)+1) = 1/(1+(D/D_0)^2);
end
end
高斯低通滤波器
for x = (-P/2):1:(P/2)-1
for y = (-Q/2):1:(Q/2)-1
D = (x^2 + y^2)^(0.5);
D_0 = 10;
H_1(x+(P/2)+1,y+(Q/2)+1) = exp(-(D*D)/(2*D_0*D_0));
D_0 = 50;
H_2(x+(P/2)+1,y+(Q/2)+1) = exp(-(D*D)/(2*D_0*D_0));
D_0 = 150;
H_3(x+(P/2)+1,y+(Q/2)+1) = exp(-(D*D)/(2*D_0*D_0));
end
end
高通滤波器
高通滤波器和低通滤波器在形式上相反,即之前允许通过的频率截止,之间截止的频率允许通过。公式上表示为高通滤波器=1-低通滤波器
的关系。
理想高通滤波器
for x = (-P/2):1:(P/2)-1
for y = (-Q/2):1:(Q/2)-1
D = (x^2 + y^2)^(0.5);
if(D >= 10) H_1(x+(P/2)+1,y+(Q/2)+1) = 1; end
if(D >= 50) H_2(x+(P/2)+1,y+(Q/2)+1) = 1; end
if(D >= 150) H_3(x+(P/2)+1,y+(Q/2)+1) = 1; end
end
end
巴特沃斯高通滤波器
for x = (-P/2):1:(P/2)-1
for y = (-Q/2):1:(Q/2)-1
D = (x^2 + y^2)^(0.5);
D_0 = 10;
H_1(x+(P/2)+1,y+(Q/2)+1) = 1/(1+(D_0/D)^2);
D_0 = 50;
H_2(x+(P/2)+1,y+(Q/2)+1) = 1/(1+(D_0/D)^2);
D_0 = 150;
H_3(x+(P/2)+1,y+(Q/2)+1) = 1/(1+(D_0/D)^2);
end
end
高斯高通滤波器
for x = (-P/2):1:(P/2)-1
for y = (-Q/2):1:(Q/2)-1
D = (x^2 + y^2)^(0.5);
D_0 = 10;
H_1(x+(P/2)+1,y+(Q/2)+1) = 1-exp(-(D*D)/(2*D_0*D_0));
D_0 = 50;
H_2(x+(P/2)+1,y+(Q/2)+1) = 1-exp(-(D*D)/(2*D_0*D_0));
D_0 = 150;
H_3(x+(P/2)+1,y+(Q/2)+1) = 1-exp(-(D*D)/(2*D_0*D_0));
end
end