14

给定图像上的一个点,我想填充连接到该点的所有点 - 但到一个新图像上。一种天真的方法是将原始图像填充为特殊的魔法颜色值。然后,访问每个像素,并将所有具有此神奇颜色值的像素复制到新图像中。一定会有更好的办法!

4

1 回答 1

27

为什么不使用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");

正方形

  • 第一个变体
cv::floodFill(img, cv::Point(150,150), cv::Scalar(255.0, 255.0, 255.0));

图像

这是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. img不变


如果你这样做,请注意:

由于掩码大于填充后的图像,因此图像中的一个像素 (x,y) 对应于掩码中的像素 (x+1, y+1)。

于 2012-09-25T03:38:29.163 回答