2013-04-05 167 views
1

我正在嘗試製作一個算法,以填充線性複雜度中的輪廓。我知道這樣的算法存在。我已經在某處讀到它與交叉口數量有關的問題,但有一個特殊情況,我還沒有很好的解決問題。填充輪廓的線性算法

到目前爲止,我已經嘗試使用以下算法。請注意,我無法訪問以前的元素(左側),因爲它們會/可能會被改寫:

for (int y = blob->miny; y < blob->maxy; ++y) 
{ 
int NumberOfBorderCrossings = 0; 
unsigned int NextElem = 0; 
unsigned int NextNextElem = 0; 
for (int x = blob->minx-1; x < blob->maxx-1; ++x) 
{ 
    NextElem = CV_IMAGE_ELEM(labelimg,unsigned int,y,x+1); 
    NextNextElem = CV_IMAGE_ELEM(labelimg,unsigned int,y,x+2); 

    if (CV_IMAGE_ELEM(labelimg,unsigned int,y,x) != label) 
    { 
     if (NextElem == label && NextNextElem != label) 
      ++NumberOfBorderCrossings; 
     else 
      if (NumberOfBorderCrossings%2) 
       CV_IMAGE_ELEM(labelimg,unsigned int,y,x) = label; 
    } 

} 
} 

結果我得到的是以下幾點。輸入在右邊(所有非黑色像素必須被複制),而錯誤的輸出在左邊。再次請注意,我只有圖像的輪廓在右側(未呈現)。 enter image description here

+0

'++ x'&'++ y'?那真的是你想要的嗎? – devnull 2013-04-05 13:13:22

+0

是的,圖像有多行。線性我的意思是線性複雜度(與斑點的大小線性縮放) – 2013-04-05 13:16:11

+0

詳細說明「填充輪廓」的含義是有幫助的。 – 2013-04-05 13:25:13

回答

2

看來您正在尋找一般的Polygon filling algorithm。您的線路交叉計數算法將打破它碰到單點和水平線和垂直線的地方。看看Quickfill可能的替代方案。

+0

這是正確的。我將嘗試實施快速填充算法。 – 2013-04-05 13:33:38