使用自適應閾值和支持動態區域的曲率尺度空間角點檢測(分析)

今天路過校園的草地,有管理人員在轟轟的開着機器割草,那草香撲鼻,不枉我是屬兔子的,那麼接下來兔發牛功:(分析步驟太細,篇幅將太大,後面部分簡略,見源代碼:http://download.csdn.net/detail/lishizelibin/3802639
function [cout,marked_img]=corner(varargin)   %主函數,在灰度圖中找角點
輸入:

I - 輸入圖,可以是灰度圖,彩色圖或二值圖
C - 主軸到輔軸的最小比率,使用提供的檢測子能夠檢測頂點爲角點,默認值爲1.5
T_angle - 正確的角點的最大圓角,默認值162
Sig - 計算曲率時高斯濾波器的標準差,默認值爲3
H, L - Canny算子的最大和最小閾值,默認值0.35和0
Endpoint - 控制曲線結束點是否爲角點的標誌,1爲Yes,0爲No,默認值爲1
Gap-size - 填充輪廓的縫隙寬度不大於此值的縫隙,默認值是1 pixels
輸出:
cout - 輸入圖像的角點座標集合
maked_image - 帶有角點標記的圖像
示例:
I = imread('alumgrns.tif'); 
cout = corner(I,[],[],[],0.2);
[cout, marked_image] = corner;
cout = corner([],1.6,155);

步驟:
(1)對灰度圖應用Canny算子,並獲得二值邊緣圖

if size(I,3)==3
    I=rgb2gray(I); %將彩色圖轉換爲灰度圖.
end
BW=EDGE(I,'canny',[L,H]); %canny邊緣檢測
(2)從二值邊緣圖獲得邊緣輪廓,並填充縫隙
[curve,curve_start,curve_end,curve_mode,curve_num]=extract_curve(BW,Gap_size); %extract_curve函數後面介紹
(3)在低尺度對每一個輪廓計算曲率,保存所有正確的角點
(4)所有曲率局部最大被視爲候選角點,根據邊界噪聲和細節特徵去除圓角和錯誤的角點
(5)如果線型曲線的終點不接近於上面曲線的角點,則增加爲角點

cout=get_corner(curve,curve_start,curve_end,curve_mode,curve_num,BW,sig,Endpoint,C,T_angle); %get_corner後面介紹
後續工作:

img=I;
for i=1:size(cout,1)
    img=mark(img,cout(i,1),cout(i,2),5);
end
marked_img=img;
figure(2)
imshow(marked_img);
title('Detected corners')
imwrite(marked_img,'corner.jpg');

function [curve,curve_start,curve_end,curve_mode,cur_num]=extract_curve(BW,Gap_size)
%首先對圖像上方和左方各加Gap_size行或列得到BW1圖像,並找到邊緣像素座標[r,c]
%while size(r,1)>0如果找到的座標維數大於0

將BW1的第一個點置爲0
在BW1上從第一個邊緣點向左一個Gap_size到向右一個Gap_size,向上一個Gap_size到向下一個Gap_size,找到邊緣像素座標,存入[I, J]
%while size(I,1)>0
計算上面找到點距離dist=(I-Gap_size-1).^2+(J-Gap_size-1).^2;
迭代點:point=point+[I(index),J(index)]-Gap_size-1;
同樣將BW1的第一個點置爲0
在BW1上從第一個邊緣點向左一個Gap_size到向右一個Gap_size,向上一個Gap_size到向下一個Gap_size,找到邊緣像素座標,存入[I, J]
% end while size(I,1)>0
%同樣的方法在另一個方向上做

%獲得曲線點
if size(cur,1)>(size(BW,1)+size(BW,2))/25
        cur_num=cur_num+1;
        curve{cur_num}=cur-Gap_size;
end
[r,c]=find(BW1==1);
%end while size(r,1)>0
%根據檢測到的點,畫出輪廓

function cout=get_corner(curve,curve_start,curve_end,curve_mode,curve_num,BW,sig,Endpoint,C,T_angle)
這個函數註釋比較清楚,高斯卷積計算曲率,找曲率局部最大作爲焦點候選,具體參考理論一文的公式
%與自適應局部閾值比較去除圓角
%根據邊界噪聲和瑣碎細節來檢查角點角度去除錯誤的角點(角點角度函數curve_tangent見後面)
根據步驟(5)增加終點爲角點

function ang=curve_tangent(cur,center)
如果不是直線,則用橢圓來計算角度

另外兩個輔助函數:
function img1=mark(img,x,y,w) %標記圖像角點
function [I,C,T_angle,sig,H,L,Endpoint,Gap_size] = parse_inputs(varargin)%分析輸入

示例:
原圖

輪廓圖:

角點標記圖:

發佈了70 篇原創文章 · 獲贊 18 · 訪問量 10萬+
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章