演算法思想:如果乙個畫素與它鄰域的畫素差別較大(過亮或過暗) , 那它更可能是角點。
演算法步驟:
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是鄰域所有特徵點中響應值最大的,則保留;否則,抑制。若鄰域內只有乙個特徵點(角點),則保留。
**如下:
; %閾值
for i=4:m-3
for j=4:n-3
p=img(i,j);
%步驟1,得到以p為中心的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
) ...
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
)]; %步驟2
if abs(pn(1)-p)9)-p)
continue
;
end%步驟3
p1_5_9_13=[abs(pn(1)-p)>t abs(pn(5)-p)>t abs(pn(9)-p)>t abs(pn(13)-p)>t];
if sum(p1_5_9_13)>=3
ind=find(abs(pn-p)>t);
%步驟4
if length(ind)>=9
score(i,j) = sum(abs(pn-p));
endend
endend
%步驟5,非極大抑制,並且畫出特徵點
for i=4:m-3
for j=4:n-3
if score(i,j)~=0
if max(max(score(i-2:i+2,j-2:j+2)))==score(i,j)
[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
), ...
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)]=...
deal(
255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255
);
endend
endend
figure;
imshow(img);
結果如下:
原圖:檢測結果:
參考:
matlab練習程式(DBSCAN)
和kmeans相比,不需要事先知道資料的類數。以程式設計的角度來考慮,具體演算法流程如下 1.首先選擇乙個待處理資料。2.尋找和待處理資料距離在設定半徑內的資料。3.將找到的半徑內的資料放到乙個佇列中。4.拿佇列頭資料作為當前待處理資料並不斷執行第2步。5.直到遍歷完佇列中所有資料,將這些資料記為一...
matlab練習程式(c c 呼叫matlab)
就我目前了解的c 呼叫matlab有兩種方法。第一種是通過matlab引擎呼叫,也就是這裡用到的方法。第二種是用matlab將m檔案編譯為相應的h lib dll檔案再加以呼叫。使用engine所用到的h和lib檔案基本在d program files matlab r2010b extern裡面,...
matlab練習程式(SUSAN檢測)
susan運算元既可以檢測角點也可以檢測邊緣,不過角點似乎比不過harris,邊緣似乎比不過canny。不過思想還是有點意思的。主要思想就是 首先做乙個和原影象等大的目標影象。然後用乙個圓形的模板,用模板去遍歷原影象每個畫素,把模板內的每個畫素都和模板中心畫素比較,如果灰度小於乙個閾值,那麼就對目標...