- 示例:
I = imread('test.jpg');
I = rgb2gray(I);
subplot(2,2,1), imshow(I), title('原图');
PQ = paddedsize(size(I));
[U, V] = dftuv(PQ(1), PQ(2));
D0 = 0.05*PQ(2);
F = fft2(I, PQ(1), PQ(2));
H = exp(-(U.^2 + V.^2) / (2 * (D0^2)));
g = dftfilt(I, H);
subplot(2,2,2), imshow(fftshift(H)), title('高斯低通滤波器');
subplot(2,2,3), imshow(log(1 + abs(fftshift(F))), []), title('图像频谱增强显示');
subplot(2,2,4), imshow(g, []), title('低通滤波结果');
function PQ = paddedsize(AB, CD)
% 计算填充尺寸以供基于FFT的滤波器
if nargin == 1
PQ = 2 * AB;
elseif nargin == 2 && ~ischar(CD)
PQ = AB + CD -1;
PQ = 2 * ceil(PQ / 2); % ceil(N)返回比N大的最小整数,为了避免出现奇数,因为处理偶数数组快
elseif nargin == 2
m = max(AB);
P = 2 ^ nextpow2(2 * m); % nextpow2(N)返回第一个P,使得2. ^ P> = abs(N)。
% 对于FFT运算,找到最接近两个序列长度的2 的幂次方通常很有用。
PQ = [P, P];
elseif nargin == 3
m = max([AB CD]);
P = 2 ^ nextpow2(2 * m);
PQ = [P, P];
else
error('Wrong number of input')
end
end
function [U, V] = dftuv(M, N)
% 用来计算到中心的距离
u = 0:(M - 1);
v = 0:(N - 1);
idx = find(u > M / 2);
u(idx) = u(idx) - M;
idy = find(v > N / 2);
v(idy) = v(idy) - N;
[V, U] = meshgrid(v, u);
end
function g = dftfilt(f, H)
% 频域滤波函数
F = fft2(f, size(H, 1), size(H, 2));
g = real(ifft2(H .* F));
g = g(1:size(f, 1), 1:size(f, 2));
end
Original: https://blog.csdn.net/m0_46203495/article/details/125272294
Author: jsBeSelf
Title: 数字图像处理笔记(频域滤波)
原创文章受到原创版权保护。转载请注明出处:https://www.johngo689.com/642406/
转载文章受原作者版权保护。转载请注明原作者出处!