数字图像处理笔记(频域滤波)

  • 示例:
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/

转载文章受原作者版权保护。转载请注明原作者出处!

(0)

大家都在看

亲爱的 Coder【最近整理,可免费获取】👉 最新必读书单  | 👏 面试题下载  | 🌎 免费的AI知识星球