2013-07-05 3 views
2

Позвольте мне начать с того, что я все еще новичок, использующий OpenCV. Некоторые вещи могут показаться очевидными, и как только я узнаю их, надеюсь, они также станут для меня очевидными.Как получить залитую область?

Моя цель - использовать функцию floodFill для создания отдельного изображения, содержащего только заполненную область. Я рассмотрел этот post, но я немного потерял, как преобразовать заполненную маску в фактическое изображение BGRA с заполненным цветом. Кроме того, мне также нужно обрезать вновь заполненное изображение, чтобы оно содержало только заполненную область. Я предполагаю, что у OpenCV есть волшебная функция, которая могла бы сделать трюк.

Вот что я пытаюсь достичь:
Исходного изображения:
enter image description here

Заполненного изображение:
enter image description here

заливки только:
enter image description here

ОБНОВЛЕНИЕ 07/07/13
Удалось заполнить отдельное изображение, используя следующий код. Тем не менее, мне все же нужно найти лучший подход, чтобы получить только заполненную область. Кроме того, моя заливка решения имеет проблемы с заполнением образа, который содержит значение альфа ...

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

Я не уверен, что вы спрашиваете, что ссылка засовывает ее в сорте :: коврик, который будет значения RGB , Вы знаете, как построены матрицы изображений? [Эта ссылка] (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; 

ручка отрицательные значения в случае. (Я полагаю, не в вашем случае)

Смежные вопросы