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