2013-07-05 71 views
2

讓我開始說我仍然是一個使用OpenCV的初學者。有些東西可能看起來很明顯,一旦我瞭解到它們,希望它們對我也很明顯。如何獲得洪水區?

我的目標是使用floodFill功能生成一個單獨的圖像,只包含填充區域。我已經研究過這個post,但是我如何將填充的蒙版轉換爲具有填充顏色的實際BGRA圖像,我有點遺憾。除此之外,我還需要裁剪新填充的圖像以僅包含填充區域。我猜OpenCV有一些神奇的功能可以做到這一點。

這裏是我想要實現:
原圖:
enter image description here

填充圖像:
enter image description here

僅填充區域:
enter image description here

UPDATE 07/07/13
能夠使用以下代碼在單獨的圖像上進行填充。但是,我仍然需要找出最佳方法來獲得填充區域。另外,我的floodfill解決方案具有與填充包含alpha值圖像的問題...

static int floodFillImage (cv::Mat &image, int premultiplied, int x, int y, int color) 
{ 
    cv::Mat out; 

    // un-multiply color 
    unmultiplyRGBA2BGRA(image); 

    // convert to no alpha 
    cv::cvtColor(image, out, CV_BGRA2BGR); 

    // create our mask 
    cv::Mat mask = cv::Mat::zeros(image.rows + 2, image.cols + 2, CV_8U); 

    // floodfill the mask 
    cv::floodFill(
      out, 
      mask, 
      cv::Point(x,y), 
      255, 
      0, 
      cv::Scalar(), 
      cv::Scalar(), 
      + (255 << 8) + cv::FLOODFILL_MASK_ONLY); 

    // set new image color 
    cv::Mat newImage(image.size(), image.type()); 
    cv::Mat maskedImage(image.size(), image.type()); 

    // set the solid color we will mask out of 
    newImage = cv::Scalar(ARGB_BLUE(color), ARGB_GREEN(color), ARGB_RED(color), ARGB_ALPHA(color)); 

    // crop the 2 extra pixels w and h that were given before 
    cv::Mat maskROI = mask(cv::Rect(1,1,image.cols,image.rows)); 

    // mask the solid color we want into new image 
    newImage.copyTo(maskedImage, maskROI); 

    // pre multiply the colors 
    premultiplyBGRA2RGBA(maskedImage, image); 

    return 0; 
} 
+1

我不知道你在問什麼,該鏈接堅持它變成CV ::墊,這將是RGB值。你知道圖像矩陣是如何構建的嗎? [This link](http://stackoverflow.com/questions/8006706/opencv-resizing-and-cropping-image-according-to-pixel- value)顯示瞭如何裁剪特定的像素值,例如某種顏色 – GPPK

+0

感謝您的發佈。我已經更新了這個問題。當我寫這篇文章的時候,我感到非常疲倦:/太倒黴了...... :(無論如何,我會看看那篇文章,看看他們在用什麼。 – Jona

回答

0

你能得到這兩個圖像的差異,以獲得不同的像素。

沒有差別的像素將爲零而其他爲正值。

cv::Mat A, B, C; 
A = getImageA(); 
B = getImageB(); 

C = A - B; 

手柄的情況下爲負值。(我相信不是你的情況)