2014-07-23 122 views
0

我只有下列位圖: original contours image 什麼我要做的是自動填寫輪廓像下面這樣: filled 這有點像MS畫家填充功能。初始輪廓不會穿過圖像的邊界。如何使用opencv自動檢測並填充封閉區域?

我還沒有一個好主意呢。 OpenCV中有沒有辦法可以做到這一點?或者有什麼建議?

在此先感謝!

+0

輸入是否保證關閉?或者,例如,輸入是否有簡單的行?後者會將一個簡單的問題轉化爲更難的方法 – Bull

+0

opencv中有一個[floodfill方法](http://docs.opencv.org/modules/imgproc/doc/miscellaneous_transformations.html#floodfill),其工作原理與一個在油漆。 – HugoRune

回答

0

如果您知道的區域必須被關閉,你可以橫向掃描,並保持邊緣計數:

// Assume image is an CV_8UC1 with only black and white pixels. 
uchar white(255); 
uchar black(0); 
cv::Mat output = image.clone(); 

for(int y = 0; y < image.rows; ++y) 
{ 
    uchar* irow = image.ptr<uchar>(y) 
    uchar* orow = output.ptr<uchar>(y) 
    uchar previous = black; 
    int filling = 0; 

    for(int x = 0; x < image.cols; ++x) 
    { 
     // if we are not filling, turn it on at a black to white transition 
     if((filling == 0) && previous == black && irow[x] == white) 
      ++filling ; 

     // if we are filling, turn it off at a white to black transition 
     if((filling != 0) && previous == white && irow[x] == black) 
      --filling ; 

     // write output image 
     orow[x] = filling != 0 ? white : black; 

     // update previous pixel 
     previous = irow[x]; 
    } 
} 
1

大概Contours Hierarchy可以幫助你實現這一目標,

你需要做的,

  • 找到每個輪廓。
  • 檢查每個輪廓的層次結構。
  • 根據層次結構將每個輪廓繪製到厚度爲filled1的新墊子上。