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