2011-05-17 209 views
0

我有一個二進制圖像,其上有1像素寬度的非閉合曲線。我想抓住這條曲線作爲點的列表(按照正確的順序)。我發現它試圖包裝所有非零像素,因此在這種情況下bwboundaries函數返回重複點:Matlab中的邊界和輪廓

>> A = [0 0 0; 1 1 1; 0 0 0]; 
>> b = bwboundaries(A) 

ans = 

    [5x2 double] 

>> b{1} 

ans = 

    2  1 
    2  2 
    2  3 
    2  2 
    2  1 

bwtraceboundary做同樣的

>> bwtraceboundary(A, [2 1], 'E') 

ans = 

    2  1 
    2  2 
    2  3 
    2  2 
    2  1 

有沒有得到像矩陣的任何標準方法[ 2 1; 2 2; 2 3]立即?

回答

2

它會產生雙重條目,因爲您的區域只有一個像素寬。我不認爲有一種標準方法直接處理你的特殊問題。但是,您可以簡單地使用unique()函數來消除結果的重複條目。

爲了保持點的原始順序,只是做:

b = bwboundaries(A); 
[dummy, ind] = unique(b{1}, 'rows', 'first'); 
contour = b{1}(sort(ind), :); 
+0

謝謝您的回答。然而'獨特的'分類點和打破輪廓。我認爲使用'ind = find(all((points(3:sz,:) == points(1:sz - 2,:))'))+ 2來改進「邊界」輸出是簡單的。 points = points(1:ind - 1,:);' – Andrey 2011-05-17 12:35:54

+0

您可以在'unique'完成工作後恢復原始順序。我相應地更新了我的答案。 – groovingandi 2011-05-17 14:25:36