susan運算元既可以檢測角點也可以檢測邊緣,不過角點似乎比不過harris,邊緣似乎比不過canny。不過思想還是有點意思的。
主要思想就是:首先做乙個和原影象等大的目標影象。然後用乙個圓形的模板,用模板去遍歷原影象每個畫素,把模板內的每個畫素都和模板中心畫素比較,如果灰度小於乙個閾值,那麼就對目標影象當前和原影象相同位置的畫素加一,直到結束。目標影象中在原影象是角點的位置就會取區域性極小,所以做乙個反向的相減。img=max(img)-img,if img**如下:
; %模板中心畫素灰度和周圍灰度差別的閾值,自己設定
usan=; %當前畫素和周圍在畫素差別在t以下的個數
%這裡用了37個畫素的模板
for i=4:m-3
%沒有在外圍擴充套件影象,最終影象會縮小
for j=4:n-3
tmp=img(i-3:i+3,j-3:j+3); %先構造7*7的模板,49
個畫素 c=0
;
for p=1:7
for q=1:7
if (p-4)^2+(q-4)^2
<=12
%在其中篩選,最終模板類似乙個圓形
% usan(k)=usan(k)+exp(-(((img(i,j)-tmp(p,q))/t)^6
));
if abs(img(i,j)-tmp(p,q))
c=c+1
;
endend
endend
usan=[usan c];
endendg=2*max(usan)/3
; %確定角點提取的數量,值比較高時會提取出邊緣,自己設定
for i=1
:length(usan)
if usan(i)
usan(i)=g-usan(i);
else
usan(i)=0
;
endend
imgn=reshape(usan,[n-6,m-6])'
;figure;
imshow(imgn)
%非極大抑制
[m n]=size(imgn);
re=zeros(m,n);
for i=2:m-1
for j=2:n-1
if imgn(i,j)>max([max(imgn(i-1,j-1:j+1)) imgn(i,j-1) imgn(i,j+1) max(imgn(i+1,j-1:j+1
))]);
re(i,j)=1
;
else
re(i,j)=0
;
endend
endfigure;
imshow(re==1);
後兩幅比第一幅小,我沒進行邊緣擴充套件。
原圖
未進行非極大抑制,似乎就是邊緣了
最後結果
這裡是不錯的詳細原理講解。
matlab練習程式(SUSAN檢測)
susan運算元既可以檢測角點也可以檢測邊緣,不過角點似乎比不過harris,邊緣似乎比不過canny。不過思想還是有點意思的。主要思想就是 首先做乙個和原影象等大的目標影象。然後用乙個圓形的模板,用模板去遍歷原影象每個畫素,把模板內的每個畫素都和模板中心畫素比較,如果灰度小於乙個閾值,那麼就對目標...
基於matlab的SUSAN特徵檢測實現
susan運算元是乙個原理簡單 易於了解的運算元。由於其指數基於對周邊象素的 灰度比較,完全不涉及梯度的運算,因此其抗雜訊能力很強,運算量也比較小 同時,susan運算元還是乙個各向同性的運算元 最後,通過控制引數t和g,可以根據具體情況很容易地對不同對比度 不同形狀的影象通過設定恰當的t和g進行控...
matlab練習程式(DBSCAN)
和kmeans相比,不需要事先知道資料的類數。以程式設計的角度來考慮,具體演算法流程如下 1.首先選擇乙個待處理資料。2.尋找和待處理資料距離在設定半徑內的資料。3.將找到的半徑內的資料放到乙個佇列中。4.拿佇列頭資料作為當前待處理資料並不斷執行第2步。5.直到遍歷完佇列中所有資料,將這些資料記為一...