2

首先让我说我仍然是使用 OpenCV 的初学者。有些事情可能看起来很明显,一旦我学会了它们,希望它们对我来说也很明显。

我的目标是使用该floodFill功能生成仅包含填充区域的单独图像。我已经查看了这篇文章,但我对如何将填充的蒙版转换为具有填充颜色的实际 BGRA 图像有点迷茫。除此之外,我还需要裁剪新填充的图像以仅包含填充区域。我猜 OpenCV 有一些神奇的功能可以解决问题。

这是我想要实现的目标:
原始图像:
在此处输入图像描述

填充图像:
在此处输入图像描述

仅填充区域:
在此处输入图像描述

更新 07/07/13
能够使用以下代码对单独的图像进行填充。但是,我仍然需要找出仅获得填充区域的最佳方法。此外,我的填充解决方案在填充包含 alpha 值的图像时存在问题......

static int floodFillImage (cv::Mat &image, int premultiplied, int x, int y, int color)
{
    cv::Mat out;

    // un-multiply color
    unmultiplyRGBA2BGRA(image);

    // convert to no alpha
    cv::cvtColor(image, out, CV_BGRA2BGR);

    // create our mask
    cv::Mat mask = cv::Mat::zeros(image.rows + 2, image.cols + 2, CV_8U);

    // floodfill the mask
    cv::floodFill(
            out,
            mask,
            cv::Point(x,y),
            255,
            0,
            cv::Scalar(),
            cv::Scalar(),
            + (255 << 8) + cv::FLOODFILL_MASK_ONLY);

    // set new image color
    cv::Mat newImage(image.size(), image.type());
    cv::Mat maskedImage(image.size(), image.type());

    // set the solid color we will mask out of
    newImage = cv::Scalar(ARGB_BLUE(color), ARGB_GREEN(color), ARGB_RED(color), ARGB_ALPHA(color));

    // crop the 2 extra pixels w and h that were given before
    cv::Mat maskROI = mask(cv::Rect(1,1,image.cols,image.rows));

    // mask the solid color we want into new image
    newImage.copyTo(maskedImage, maskROI);

    // pre multiply the colors
    premultiplyBGRA2RGBA(maskedImage, image);

    return 0;
}
4

1 回答 1

0

您可以获取这两个图像的差异以获得不同的像素。

没有差异的像素将为零,其他为正值。

cv::Mat A, B, C;
A = getImageA();
B = getImageB();

C = A - B;

在这种情况下处理负值。(我认为不是你的情况)

于 2013-08-01T02:14:27.973 回答