2014-06-06 28 views
0

我有一個10x10二進制位圖如下。我正在尋找一種有效的在MATLAB中查找其輪廓的方法。 (我試圖讓每一個值「東張西望」鄰國的價值觀和決定,但實在是太沒有效率。我期望算法來擴展。)MATLAB - 查找二進制位圖的輪廓?

false false false false false false false false false false 
false false true true true true true true false false 
false true true true true true true true true false 
false true true true true true true true true false 
false true true true true true true true true false 
false true true true true true true true true false 
false true true true true true true true true false 
false true true true true true true true true false 
false false true true true true true true false false 
false false false false false false false false false false 

假設每個布爾值類似於方,並左下角坐落在x: 0-1; y: 0-1之上。輸出應該是形成邊界的點。你可以假設內部的true塊總是凸起的。

回答

2

這很簡單。假設你有圖像處理工具箱,在MATLAB中使用bwperim命令。

你可以調用函數像這樣:

out = bwperim(A); %//or 
out = bwperim(A,conn); 

第一種方法假定像素連接爲4像素附近。這隻會看看北,南,東,西方向。

如果您指定一個名爲conn的附加參數(它是一個單一數字),則可以覆蓋此行爲並指定在查看相鄰像素時所需的行爲類型。例如,如果conn=8,您將查看2D的8像素鄰域(如N,NE,E,SE,S,SW,W,NW),或者如果您有3D二進制圖像,則可以進入3D。但現在,我假設它只是2D。爲了獲得最佳的精度,使用8

因此,我們有:

A = [false false false false false false false false false false 
false false true true true true true true false false 
false true true true true true true true true false 
false true true true true true true true true false 
false true true true true true true true true false 
false true true true true true true true true false 
false true true true true true true true true false 
false true true true true true true true true false 
false false true true true true true true false false 
false false false false false false false false false false]; 

out = bwperim(A,8); 

它看起來像:

out = 

0  0  0  0  0  0  0  0  0  0 
0  0  1  1  1  1  1  1  0  0 
0  1  1  0  0  0  0  1  1  0 
0  1  0  0  0  0  0  0  1  0 
0  1  0  0  0  0  0  0  1  0 
0  1  0  0  0  0  0  0  1  0 
0  1  0  0  0  0  0  0  1  0 
0  1  1  0  0  0  0  1  1  0 
0  0  1  1  1  1  1  1  0  0 
0  0  0  0  0  0  0  0  0  0 

MATLAB輸出1爲真,0表示假。

作爲獎勵,這是什麼形狀看起來像並排:

enter image description here

從註釋

您的意見去修改,你希望找到的點的集合是使周長。因此,您可以簡單地使用find命令爲您執行此操作。

[X,Y] = find(out == 1); 
coords = [X Y]; 

什麼find命令的功能是它搜索您的陣列和發現陣列中匹配的find參數給出的布爾表達式的位置。在這種情況下,我們希望找到所有座標,其中out中的像素等於1,而out是我們的周邊圖像。因此,這有效地找到了周邊像素的所有像素。

因此,我們得到:

coords = 

    3  2 
    4  2 
    5  2 
    6  2 
    7  2 
    8  2 
    2  3 
    3  3 
    8  3 
    9  3 
    2  4 
    9  4 
    2  5 
    9  5 
    2  6 
    9  6 
    2  7 
    9  7 
    2  8 
    3  8 
    8  8 
    9  8 
    3  9 
    4  9 
    5  9 
    6  9 
    7  9 
    8  9 

X是行座標,而Y是列座標。我已將XY整合到一個2D陣列中以便更好地呈現,但您可以自行取XY變量以進行進一步處理。

希望這會有所幫助!

+0

感謝了很多人!我的最終目標實際上是獲得一系列構成邊界的點。從這裏到這個目標似乎還有點棘手 –

+0

@FarticlePilter這也很容易。簡單地做'[X,Y] =查找(出== ==);'我也編輯了我的文章以反映您的評論。 – rayryeng

+0

非常感謝!幾乎完成。現在問題是我需要得到線邊界而不是方形邊界。直接從'[X,Y] = find(out == 1)'獲取'給我一個「更小」的邊界,就像這樣http://i.stack.imgur.com/j5rwN.png但是我需要邊界線http://i.stack.imgur.com/5u40a.png非常感謝! –

2

這裏的另一種選擇:

B = bwboundaries(A) 

這將讓任何邊界的x-y座標。查看更多信息here ...

+0

這也是一個不錯的選擇。它找到**圖像中所有對象的周長。好一個! – rayryeng

2

另一種選擇與圖像處理工具箱:

B = A - imerode(A,SE); 

其中SE是內核的一個信息:根據您想使用的連接

0 1 0 1 1 1 
1 1 1 1 1 1 
0 1 0 1 1 1 

:第一一個用於8連接,另一個用於4連接。對於這兩者之間的區別,回想一下,8連通性允許對角線的鄰居。

隨着圖像B,你可以找到周邊的所有點與另一個答案顯示同樣的技術:

[Xp,Yp] = find(B);