OpenCV - 洪水填充到新Mat

时间:2012-09-25 01:06:37

标签: image-processing opencv flood-fill

考虑到图像上的一个点,我想将所有连接到该点的点填充到一个新图像上。一种天真的方法是将原始图像填充到特殊的魔术颜色值。然后,访问每个像素,并将具有此魔术颜色值的所有像素复制到新图像。必须有更好的方法!

1 个答案:

答案 0 :(得分:25)

为什么不使用cv::floodFill的第二个变体来创建蒙版?

  

int floodFill(InputOutputArray image,InputOutputArray mask,Point   seedPoint,Scalar newVal,Rect * rect = 0,Scalar loDiff = Scalar(),Scalar   upDiff = Scalar(),int flags = 4)


  • 原始图片

    cv::Mat img = cv::imread("squares.png");

squares

  • 第一个变种

    cv::floodFill(img, cv::Point(150,150), cv::Scalar(255.0, 255.0, 255.0));

img这是img

  • 第二个变种

    cv::Mat mask = cv::Mat::zeros(img.rows + 2, img.cols + 2, CV_8U); cv::floodFill(img, mask, cv::Point(150,150), 255, 0, cv::Scalar(), cv::Scalar(), 4 + (255 << 8) + cv::FLOODFILL_MASK_ONLY);

mask这是maskimg不会改变


如果你这样做,请注意:

  

由于遮罩大于填充图像,因此图像中的像素(x,y)对应遮罩中的像素(x + 1,y + 1)。