好老的技术了,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