MATLAB FAST特徵點檢測
阿新 • • 發佈:2020-09-10
演算法思想:如果一個畫素與它鄰域的畫素差別較大(過亮或過暗) , 那它更可能是角點。
演算法步驟:
1.上圖所示,一個以畫素p為中心,半徑為3的圓上,有16個畫素點(p1、p2、...、p16)。
2.定義一個閾值。計算p1、p9與中心p的畫素差,若它們絕對值都小於閾值,則p點不可能是特徵點,直接pass掉;否則,當做候選點,有待進一步考察;
3.若p是候選點,則計算p1、p9、p5、p13與中心p的畫素差,若它們的絕對值有至少3個超過閾值,則當做候選點,再進行下一步考察;否則,直接pass掉;
4.若p是候選點,則計算p1到p16這16個點與中心p的畫素差,若它們有至少9個超過閾值,則是特徵點;否則,直接pass掉。
5.對影象進行非極大值抑制:計算特徵點出的FAST得分值(即score值,也即s值),判斷以特徵點p為中心的一個鄰域(如3x3或5x5)內,計算若有多個特徵點,則判斷每個特徵點的s值(16個點與中心差值的絕對值總和),若p是鄰域所有特徵點中響應值最大的,則保留;否則,抑制。若鄰域內只有一個特徵點(角點),則保留。
程式碼如下:
1 clear all;
2 close all;
3 clc;
4
5 img=imread('lena.jpg');
6 imshow(img)
7
8 [m n]=size(img);
9 score=zeros(m,n);
10
11 t=60 ; %閾值
12 for i=4:m-3
13 for j=4:n-3
14 p=img(i,j);
15 %步驟1,得到以p為中心的16個鄰域點
16 pn=[img(i-3,j) img(i-3,j+1) img(i-2,j+2) img(i-1,j+3) img(i,j+3) img(i+1,j+3) img(i+2,j+2) img(i+3,j+1) ...
17 img(i+3,j) img(i+3,j-1) img(i+2,j-2) img(i+1,j-3) img(i,j-3) img(i-1 ,j-3) img(i-2,j-2) img(i-3,j-1)];
18
19 %步驟2
20 if abs(pn(1)-p)<t && abs(pn(9)-p)<t
21 continue;
22 end
23
24 %步驟3
25 p1_5_9_13=[abs(pn(1)-p)>t abs(pn(5)-p)>t abs(pn(9)-p)>t abs(pn(13)-p)>t];
26 if sum(p1_5_9_13)>=3
27 ind=find(abs(pn-p)>t);
28 %步驟4
29 if length(ind)>=9
30 score(i,j) = sum(abs(pn-p));
31 end
32 end
33 end
34 end
35
36 %步驟5,非極大抑制,並且畫出特徵點
37 for i=4:m-3
38 for j=4:n-3
39 if score(i,j)~=0
40 if max(max(score(i-2:i+2,j-2:j+2)))==score(i,j)
41 [img(i-3,j), img(i-3,j+1), img(i-2,j+2), img(i-1,j+3), img(i,j+3), img(i+1,j+3), img(i+2,j+2), img(i+3,j+1), ...
42 img(i+3,j), img(i+3,j-1), img(i+2,j-2), img(i+1,j-3), img(i,j-3), img(i-1,j-3), img(i-2,j-2), img(i-3,j-1)]= ...
43 deal(255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255);
44 end
45 end
46 end
47 end
48 figure;
49 imshow(img);
結果如下:
原圖:
檢測結果: