clear all; close all;
I = imread('liftingbody.png');
I = im2double(I);
M = 2 * size(I, 1);
N = 2 * size(I, 2);
u = -M / 2 : (M / 2 - 1);
v = -N / 2 : (N / 2 - 1);
[U, V] = meshgrid(u, v);
D = sqrt(U.^2 + V.^2);
D0 = 50;
n = 6;
H = 1 ./ (1 + (D ./ D0).^ (2 * n));
J = fftshift(fft2(I, size(H, 1), size(H, 2)));
K = J .* H;
L = ifft2(ifftshift(K));
L = L(1:size(I, 1), 1:size(I, 2));
figure;
subplot(121);
imshow(I);
title('Original Image');
subplot(122);
imshow(L);
title('Filtered Image');
解释:
-
clear all; close all;
:清空工作空间中的所有变量并关闭所有图形窗口。 -
I = imread('liftingbody.png');
:读取名为liftingbody.png
的图像,并赋值给I
。 -
I = im2double(I);
:将图像I
的数据类型转换为双精度浮点数,以便进行后续处理。 -
M = 2 * size(I, 1); N = 2 * size(I, 2);
:计算图像尺寸的两倍,以便创建一个足够大的空间来容纳FFT变换后的频率图像。 -
u = -M / 2 : (M / 2 - 1); v = -N / 2 : (N / 2 - 1);
:创建一个关于原点对称的u和v坐标数组,用于计算频率域中的位置。 -
[U, V] = meshgrid(u, v);
:生成网格坐标,用于计算每个频率位置的距离。 -
D = sqrt(U.^2 + V.^2);
:计算每个频率位置到原点的距离。 -
D0 = 50; n = 6;
:设置截止频率D0
和滤波器阶数n
。 -
H = 1 ./ (1 + (D ./ D0).^ (2 * n));
:创建一个巴特沃斯低通滤波器H
,其中D0
是截止频率,n
是滤波器的阶数。 -
J = fftshift(fft2(I, size(H, 1), size(H, 2)));
:对图像I
进行二维FFT变换,并使用fftshift
将零频分量移到中心。 -
K = J .* H;
:将FFT变换后的图像J
与巴特沃斯低通滤波器H
进行逐元素相乘,以去除高频噪声。 -
L = ifft2(ifftshift(K));
:对滤波后的频率图像K
进行逆FFT变换,并使用ifftshift
将零频分量移回原位。 -
L = L(1:size(I, 1), 1:size(I, 2));
:裁剪逆FFT变换后的图像,使其与原始图像大小相同。 -
figure;
:创建一个新的图形窗口。 -
subplot(121); imshow(I);
:在第一个子图(1,2,1)中显示原始图像I
。 -
subplot(122); imshow(L);
:在第二个子图(1,2,2)中显示滤波后的图像L
。
拓展:
- 保存滤波后的图像:可以将滤波后的图像
L
保存为文件。
% 保存滤波后的图像
imwrite(uint8(L), 'liftingbody_filtered.png');
-
尝试不同的D0值和n值:可以尝试使用不同的截止频率
D0
和滤波器阶数n
来观察对图像滤波效果的影响。 -
使用不同的滤波器类型:可以尝试使用不同的滤波器类型,如高斯滤波器等,来比较不同的滤波效果。
-
分析滤波效果:可以分析滤波前后图像的质量,比如通过计算图像的峰值信噪比(PSNR)来评估滤波效果。
-
创建交互式滤波器设计:可以创建一个交互式界面,允许用户调整滤波器参数并实时查看滤波效果。