zoukankan      html  css  js  c++  java
  • matlab练习程序(steerable filters)

    好老的技术了,91年的,不过我发现网上介绍的还真不多。

    steerable filters方向可调滤波器,通过在不同方向上产生模板,然后用不同方向上的模板去卷积图像,就能得到图像的边缘。

    产生的模板分不同阶,不同阶有不同的系数,系数分幅度系数和方向系数,最后的模板是不同方向上的系数相乘再相加。

    下面是一些求系数的公式,都是在mit的一个教程上找到的,并且我也用了其中的三阶系数来编程。

    二阶系数:

    三阶系数:

    四阶系数:

    五阶系数:

    最终需要的模板G=Ha*ka+Hb*kb+Hc*kc等等就看用几阶了。

    matlab代码:

    clear all;
    close all;
    clc;
    
    sigma=0.5;
    h=floor(2*sigma+1); 
    w=h; 
    [x y]=meshgrid(-w:w,-h:h);
    Ga=0.9213*(-2.254*x+x.^3).*exp(-(x.^2+y.^2)/(2*sigma^2));   %各种三阶的幅度系数
    Gb=1.843*(-0.7515+x.^2).*y.*exp(-(x.^2+y.^2)/(2*sigma^2));
    Gc=0.9780*(-0.7515+y.^2).*x.*exp(-(x.^2+y.^2)/(2*sigma^2));
    Gd=0.9780*(-2.254*y+y.^3).*exp(-(x.^2+y.^2)/(2*sigma^2));
    
    img=double(imread('rice.png'));
    [m n]=size(img);
    edge=zeros(m,n);
    
    for i=0:30:360              %一次转过30度角
        theta=(i/180)*pi;
        Ka=cos(theta)^3;            %各种三阶的角度系数
        Kb=-3*cos(theta)^2*sin(theta);
        Kc=3*cos(theta)*sin(theta)^2;
        Kd=-sin(theta)^3;
        G=Ka*Ga+Kb*Gb+Kc*Gc+Kd*Gd;      %待卷积模板
        
        imgn=imfilter(img,G,'replicate');
        
        figure(1)
        imshow(imgn,[]);
        edge=sqrt(edge.^2+imgn.^2);
    end
    
    imshow(edge,[])

    运行结果:

    不过有一点让我无法释怀的就是自己一直没搞明白那些系数是怎么求出来的。

    谁要是知道,请不吝赐教。

    主要参考:

    1.http://persci.mit.edu/pub_pdfs/freeman_steerable.pdf

    2.http://bigwww.epfl.ch/demo/steerable/edge.html

    3.http://people.csail.mit.edu/billf/steer.html

  • 相关阅读:
    离散型随机变量及其分布列
    建立概率模型
    几何概型习题
    古典概型习题
    含绝对值符号的问题
    临界状态在数学中的应用
    古典概型中的几何体计数
    条件概率
    创建可以滚动的表格
    NoSQL数据库种类
  • 原文地址:https://www.cnblogs.com/tiandsp/p/2981586.html
Copyright © 2011-2022 走看看