1

请帮助我理解以下理想低通滤波器的 MATLAB 代码。我无法理解以下代码中的第 2 部分。请解释一下我们为什么要这样做。

我已阅读 Rafael C. Gonzalez 的使用 Matlab 2E 进行数字图像处理,它解释了我的问题,但我无法正确理解。如果有人能清楚地解释我,这将是有帮助的。

注意:Dogbert,我的理解是对图像应用变换有助于分离低频和高频分量。左上角包含更多的低频系数,而右下角包含高频系数。低频分量包含所有细节(近似值),而高频分量包含图像中较小的细节。在低通滤波器中,允许低于截止频率的频率通过,并阻止高于截止频率的频率。

 %IDEAL LOW-PASS FILTER

%Part 1
        function idealfilter(X,P) % X is the input image and P is the cut-off freq
        f=imread(X);  % reading an image X
        [M,N]=size(f); % Saving the the rows of X in M and columns in N
        F=fft2(double(f)); % Taking Fourier transform to the input image
%Part 2 % I don't understand this part
        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);
        D=sqrt(U.^2+V.^2);

%Part 3
        H=double(D<=P);       % Comparing with the cut-off frequency 
        G=H.*F;               % Convolution with the Fourier transformed image
        g=real(ifft2(double(G))); % Inverse Fourier transform
        imshow(f),figure,imshow(g,[ ]); % Displaying input and output image
        end

对于 M=8 和 N=8,我尝试单独运行 Part2 中的每个命令。我明白了

u=0:(M-1); ==> u = 0 1 2 3 4 5 6 7

v=0:(N-1); ==> v = 0 1 2 3 4 5 6 7

idx=find(u>M/2); ==> idx = 6 7 8 

u(idx)=u(idx)-M; ==> 0 1 2 3 4 -3 -2 -1

idy=find(v>N/2); ==> idy = 6 7 8 

v(idy)=v(idy)-N; ==> 0 1 2 3 4 -3 -2 -1

[V,U]=meshgrid(v,u); ==> 

V=

     0     1     2     3     4    -3    -2    -1
     0     1     2     3     4    -3    -2    -1
     0     1     2     3     4    -3    -2    -1
     0     1     2     3     4    -3    -2    -1
     0     1     2     3     4    -3    -2    -1
     0     1     2     3     4    -3    -2    -1
     0     1     2     3     4    -3    -2    -1
     0     1     2     3     4    -3    -2    -1

U =

     0     0     0     0     0     0     0     0
     1     1     1     1     1     1     1     1
     2     2     2     2     2     2     2     2
     3     3     3     3     3     3     3     3
     4     4     4     4     4     4     4     4
    -3    -3    -3    -3    -3    -3    -3    -3
    -2    -2    -2    -2    -2    -2    -2    -2
    -1    -1    -1    -1    -1    -1    -1    -1

我不确定他们为什么这样做。请帮助我理解这个 MATLAB 代码。并且还帮助我理解为什么他们必须fftshift在下面的 MATLAB 代码中使用。我确实阅读了 MATLAB 文档,但我无法正确理解它。如果可能的话,用一个例子来解释。提前致谢。帮我学习。

%This code is used to Butterworth lowpass filter
close all;
clear all;
clc;
im=imread('lean.jpg');
fc=20;%Cutoff frequency
n=1;
[co,ro] = size(im);
cx = round(co/2); % find the center of the image
cy = round (ro/2);
imf=fftshift(fft2(im));
H=zeros(co,ro);
for i = 1 : co
    for j =1 : ro
        d = (i-cx).^2 + (j-cy).^ 2;
        H(i,j) = 1/(1+((d/fc/fc).^(2*n)));
    end;
end;
outf = imf .* H;
out = abs(ifft2(outf));
imshow(im),title('Original Image'),figure,imshow(uint8(out)),title('Lowpass Filterd Image')
4

1 回答 1

1

他们将高于给定频率的频率归零。
他们使用径向掩码来设置输入或输出频率。
为了做到这一点,他们构建了一个网格并将其移动,因为 DFT 转换是 0 到 2pi。

于 2014-06-05T19:07:40.030 回答