14

画像上のポイントを指定して、そのポイントに接続されているすべてのポイントを塗りつぶしたいのですが、新しい画像に塗りつぶします。これを行うための素朴な方法は、元の画像を特別な魔法の色の値に塗りつぶすことです。次に、各ピクセルにアクセスし、この魔法の色の値を持つすべてのピクセルを新しい画像にコピーします。より良い方法があるに違いありません!

4

1 に答える 1

27

cv :: FloodFillの2番目のバリアントを使用してマスクを作成してみませんか?

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

これはimg

  • 2番目のバリアント
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 に答える