2017-07-16 161 views
-1

this answer,我知道如何创建一个高通巴特沃斯滤波器。我知道lowpasskernel = 1 - highpasskernel如何在Matlab中实现低通Butterworth滤波器?

所以,我创建以下低通Butterworth滤波器电路,

function [out, kernel] = butterworth_lp(I, Dl, n) 
    height = size(I, 1); 
    width = size(I, 2); 

    [u, v] = meshgrid(-floor(width/2):floor(width/2)-1,-floor(height/2):floor(height/2)-1); 

    % lp_kernel = 1 - hp_kernel 
    kernel = 1 - butter_hp_kernel(u, v, Dl, n); 

    % fft the image 
    I_fft_shifted = fftshift(fft2(double(I))); 

    % apply lowpass filter 
    I_fft_shift_filtered = I_fft_shifted .* kernel; 

    % inverse FFT, get real components 
    out = real(ifft2(ifftshift(I_fft_shift_filtered))); 

    % normalize and cast 
    out = (out - min(out(:)))/(max(out(:)) - min(out(:))); 
    out = uint8(255*out); 

function k = butter_hp_kernel(u, v, Dh, n) 
    uv = u.^2+v.^2; 
    D = sqrt(uv); 
    frac = Dh./D; 
    p = 2*n; 
    denom = frac.^p; 
    k = 1./denom; 

输出

enter image description here

这不是一个低通滤波器的输出。

那么,我的代码有什么问题?

+0

你在哪里做1 - 什么? –

+0

好的。但是你运行了哪些代码来获取该图像?刚刚编辑它的事实并没有使我充满信心...... –

+0

@OliverCharlesworth,你的疑惑都解决了。 – anonymous

回答

-1

好。我已经跟随following formula (Page #8/48)解决了这个问题,

enter image description here

输出

enter image description here

源代码

butter_lp_kernel.m

function f = butter_lp_f(u, v, Dl, n) 
    uv = u.^2+v.^2; 
    Duv = sqrt(uv); 
    frac = Duv./Dl; 
    denom = frac.^(2*n); 
    f = 1./(1.+denom); 

function k = butter_lp_kernel(I, Dl, n) 
    Height = size(I,1); 
    Width = size(I,2); 

    [u, v] = meshgrid(... 
        -floor(Width/2) :floor(Width-1)/2, ... 
        -floor(Height/2): floor(Height-1)/2 ... 
       ); 

    k = butter_lp_f(u, v, Dl, n); 

ifftshow.m

function out = ifftshow(f) 
    f1 = abs(f); 
    fm = max(f1(:)); 
    out = f1/fm; 
end 

butterworth_lpf.m

function [out1, out2] = butterworth_lpf(I, Dl, n) 

    Kernel = butter_lp_kernel(I, Dl, n); 

    I_ffted_shifted = fftshift(fft2(I)); 

    I_ffted_shifted_filtered = I_ffted_shifted.*Kernel; 

    out1 = ifftshow(ifft2(I_ffted_shifted_filtered)); 

    out2 = ifft2(ifftshift(I_ffted_shifted_filtered)); 
end 
2

你没有公式正确复制的高通滤波器:

uv = u.^2+v.^2; 
D = uv.^0.5; 
frac = Dh./D; 
p = 2*n; 
denom = frac.^p; 
k = 1./(1+denom); --> you forgot the "1+" 

新的输出:

enter image description here

+2

不,网格调用是正确的。这个公式也可能是不正确的,这是主要的罪魁祸首。为了给出更好的答案,请提供过滤器的正确实施。目前这个答案在这个状态下没有帮助。 – rayryeng

+0

的确,在电影中它是不同的,但没关系。这是错误的公式。我会编辑它。 – 10a

+0

此外,为了充分利用这一点以及我的投票,实际上展示了一个示例过滤图像。它真的会表明这是一个错误的公式。 – rayryeng