matlab練習程式(SUSAN檢測)

2022-06-12 06:12:07 字數 1901 閱讀 4704

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.直到遍歷完佇列中所有資料,將這些資料記為一...