2013-08-05 65 views
3

我在矩陣中有一個對象的佔位面積,簡而言之就是對象佔據的單元格(對象是一個部分,標記爲0的單元格是未佔用的,標記爲1的單元格被對象佔據)。然後,我有一個在矩陣座標list<pair<int, int> >中佔用的單元格列表。如何在矩陣(座標系)中找到對象的邊界

如何查找屬於該對象的該對象的所有邊框單元格? (相鄰的單元例如是(x1, y1)(x2, y2) if abs(x1-x2)<=1 && abs(y1-y2)<=1)。

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

回答

2
  1. 首先,找對象。它可以使用flood fill完成。
  2. (1)中找到的所有單元都是候選,遍歷所有候選併產生具有值爲0的一個或多個相鄰單元的單元。 (或者,如果其在基質的邊緣)

一種可能的優化將是「探索」僅具有與基質的0 /邊緣相鄰小區的細胞。

1

使用邊走邊框:定義一個2x2單元格的窗口,並在對象外部開始某處 ,例如,在左上角。然後,根據窗口內看到的模式移動 窗口周圍:

0 0 
0 0 

- >你還是得找對象的邊緣。向右移動兩步到 ;如果碰到右邊緣,向下移動兩個臺階,並向左移動(一種行掃描)。

0 0 
0 1 

- >向右移動一步。

0 0 
1 1 

- >向右移動一步。

0 0 
1 0 

- >向下移動一步。

0 1 
0 1 

- >向上移動一步。

0 1 
1 1 

- >向上移動一步。

你周圍的邊順時針移動這樣。你遇到的任何1都可以看作是物體的邊緣部分;儘管可以將上面最後一個示例中的右下角1作爲不是邊(這是定義的 問題)。

只要您遇到第一個打到 邊緣的位置,您就完成了。

請注意以下特殊情況,這可能需要特殊的 處理(例如,在遇到記住它):

0 1 
1 0 
5

設置一個像素爲0;如果它的所有相鄰像素的1其餘1S是一個邊界:

for (x = 1; x < width-1; ++x) { 
    for (y = 1; y < height-1; ++y) { 
    if (data(x+1,y) && data(x-1,y) && data(x,y+1) && data(x,y-1)) { 
     data(x,y) = 0; 
    } 
    } 
} 
相關問題