這很簡單。假設你有圖像處理工具箱,在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表示假。
作爲獎勵,這是什麼形狀看起來像並排:
從註釋
您的意見去修改,你希望找到的點的集合是使周長。因此,您可以簡單地使用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
是列座標。我已將X
和Y
整合到一個2D陣列中以便更好地呈現,但您可以自行取X
和Y
變量以進行進一步處理。
希望這會有所幫助!
感謝了很多人!我的最終目標實際上是獲得一系列構成邊界的點。從這裏到這個目標似乎還有點棘手 –
@FarticlePilter這也很容易。簡單地做'[X,Y] =查找(出== ==);'我也編輯了我的文章以反映您的評論。 – rayryeng
非常感謝!幾乎完成。現在問題是我需要得到線邊界而不是方形邊界。直接從'[X,Y] = find(out == 1)'獲取'給我一個「更小」的邊界,就像這樣http://i.stack.imgur.com/j5rwN.png但是我需要邊界線http://i.stack.imgur.com/5u40a.png非常感謝! –