OpenCV-填充到新的Mat上

问题描述 投票:13回答:1

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

image-processing opencv flood-fill
1个回答
26
投票

为什么不使用cv::floodFill的第二种形式来创建遮罩?

int FloodFill(InputOutputArray图片,InputOutputArray掩码,点seedPoint,标量newVal,Rect * rect = 0,标量loDiff = Scalar(),标量upDiff = Scalar(),int标志= 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);

“

这是maskimg不变

但是,如果要这样做,请注意:

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

© www.soinside.com 2019 - 2024. All rights reserved.