首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >如何在Matlab中实现高通巴特沃斯滤波器?

如何在Matlab中实现高通巴特沃斯滤波器?
EN

Stack Overflow用户
提问于 2017-07-17 16:26:23
回答 1查看 1.7K关注 0票数 0

根据Page#14 of 此链接的说法,高通巴特沃斯滤波器的方程是:

根据Page#17的说法,输出应该如下所示,

现在,我已经看过这个回答如此,并使用链接的pdf文档中给出的公式编写了下面的Matlab代码。

输出看起来不同于上面给出的输出。

我的源代码中有什么可能的问题?

源代码

main.m

代码语言:javascript
复制
clear_all();

I = gray_imread('cameraman.png');

n = 1;
Dh = 10;

[J, Kernel] = butterworth_hp(I, Dh, n);

imshowpair(I, J, 'montage');

butterworth_hp.m

代码语言:javascript
复制
function [out, kernel] = butterworth_hp(I, Dh, n)
height = size(I, 1);
width = size(I, 2);

I_fft_shifted = fftshift(fft2(double(I)));

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

I_fft_shift_filtered = I_fft_shifted .* kernel;

out = real(ifft2(ifftshift(I_fft_shift_filtered)));

out = (out - min(out(:))) / (max(out(:)) - min(out(:)));
out = uint8(255*out);


function k = butter_hp_kernel(u, v, D0, n)
uv =  u.^2+v.^2;
Duv = uv.^0.5;
frac = D0./Duv;
p = 2*n;
denom =  frac.^p;
A = 0.414;
k = 1./(1+A*denom);
EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2017-07-17 20:03:50

我已经解决了这个问题。

解决这个问题的关键是函数ifftshow()

源代码

main.m

代码语言:javascript
复制
clear_all();
I = gray_imread('cameraman.png');
Dh = 10;
n = 1;
[J, K] = butterworth_hpf(I, Dh, n);

imshowpair(I, K, 'montage');
%draw_multiple_images({I, J, K});

ifftshow.m

代码语言:javascript
复制
function out = ifftshow(f)
    f1 = abs(f);
    fm = max(f1(:));
    out = f1/fm;
end

butter_hp_kernel.m

代码语言:javascript
复制
function k = butter_hp_kernel(I, Dh, 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_hp_f(u, v, Dh, n);

function f = butter_hp_f(u, v, Dh, n)
    uv = u.^2+v.^2;
    Duv = sqrt(uv);
    frac = Dh./Duv;
    %denom = frac.^(2*n);
    A=0.414; denom = A.*(frac.^(2*n));    
    f = 1./(1.+denom);

butterworth_hpf.m

代码语言:javascript
复制
function [out1, out2] = butterworth_hpf(I, Dh, n)

    Kernel = butter_hp_kernel(I, Dh, 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
票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/45149224

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档