读入一幅图像,进行理想低通滤波,取理想低通滤波的截止频率分别为5,15,35,70, 计算能量谱,显示在一个图窗厘显示原始图像和滤波后的图像,并标注截止频率。用MATLAB实现
时间: 2024-02-11 13:09:12 浏览: 126
好的,这是一个图像处理的问题。我会为您提供一个MATLAB的解决方案。
首先,我们需要读入一幅图像,并将其转换为矩阵。
```matlab
im = imread('image.jpg');
im = im2double(im);
```
接着,我们可以对图像进行理想低通滤波了。理想低通滤波是一种非常理想化的滤波器,它可以完全去除高于截止频率的信号。在本题中,我们需要分别取截止频率为5,15,35,70。
```matlab
% 理想低通滤波器
function H = ideal_lowpass_filter(shape, cutoff)
% 生成理想低通滤波器
[m, n] = shape;
H = zeros(m, n);
for u = 1:m
for v = 1:n
D = sqrt((u - m / 2)^2 + (v - n / 2)^2);
if D <= cutoff
H(u, v) = 1;
end
end
end
end
% 取截止频率为5,15,35,70
cutoffs = [5, 15, 35, 70];
Hs = arrayfun(@(cutoff)ideal_lowpass_filter(size(im), cutoff), cutoffs, 'UniformOutput', false);
```
接下来,我们可以计算能量谱了。能量谱是图像的傅里叶变换的模平方,它可以反映出图像的频率分布情况。
```matlab
% 计算能量谱
function S = energy_spectrum(im)
% 计算图像的能量谱
F = fft2(im);
F = fftshift(F);
S = abs(F).^2;
S = log(1 + S);
end
% 分别计算四个截止频率下的能量谱
Ss = cellfun(@(H)energy_spectrum(ifft2(ifftshift(H .* fftshift(fft2(im)))).real), Hs, 'UniformOutput', false);
```
现在,我们可以将原始图像和滤波后的图像在一个图窗中显示出来,并标注截止频率了。
```matlab
% 绘制图像
figure;
subplot(2, 5, 1);
imshow(im);
title('Original Image');
for i = 1:numel(cutoffs)
H = Hs{i};
S = Ss{i};
% 滤波
im_filtered = ifft2(ifftshift(H .* fftshift(fft2(im)))).real;
subplot(2, 5, i+1);
imshow(im_filtered);
title(sprintf('Cutoff = %d', cutoffs(i)));
% 能量谱
subplot(2, 5, i+6);
imshow(S);
title('Energy Spectrum');
% 标注截止频率
hold on;
line([size(im, 2) / 2 - cutoffs(i), size(im, 2) / 2 - cutoffs(i)], [0, size(im, 1)], 'Color', 'r', 'LineStyle', '--');
line([size(im, 2) / 2 + cutoffs(i), size(im, 2) / 2 + cutoffs(i)], [0, size(im, 1)], 'Color', 'r', 'LineStyle', '--');
line([0, size(im, 2)], [size(im, 1) / 2 - cutoffs(i), size(im, 1) / 2 - cutoffs(i)], 'Color', 'r', 'LineStyle', '--');
line([0, size(im, 2)], [size(im, 1) / 2 + cutoffs(i), size(im, 1) / 2 + cutoffs(i)], 'Color', 'r', 'LineStyle', '--');
hold off;
end
```
运行上述代码,即可得到原始图像和滤波后的图像,并标注了截止频率的能量谱。
阅读全文