如何在给定特定颜色的情况下提取图像的一部分?

时间:2015-11-13 12:15:51

标签: c++ c image opencv image-segmentation

PNG image我有一张图片(如下所示)。我想只提取粉红色部分并删除图像的其余部分。我将粉红色的RGB值存储在一个数组中。有没有什么方法可以在图像和颜色上使用bitwise_and,以便我可以在OpenCV中挑出所需的部分?

2 个答案:

答案 0 :(得分:3)

Bitwise_and不是正确的方法,因为它是按位的。但OpenCv当然有一些方法可以完成这项基本任务:

如果您知道确切的值,则可以使用CmpS方法。如果要查找特定范围内的所有粉红色,请使用InRangeS方法。可选地,首先改变图像的色彩空间,例如,如果你想在HSV空间中指定你的范围。

答案 1 :(得分:3)

由于您的绿色颜色不均匀,但其范围为:

// in BGR color space
Scalar low(182, 204, 168);
Scalar high(187, 207, 172);

// in HSV color space
Scalar low(72, 43, 204);
Scalar high(72, 45, 207);

您可以使用inRange功能。您可以根据分割所需的颜色调整范围。

通常HSV色彩空间更适合基于颜色的分割任务,但在这种情况下,BGR色彩空间也足够好。

此代码显示如何获取所需颜色的二进制掩码,以及如何仅在BGR和HSV颜色空间中复制原始图像的蒙版部分。

#include <opencv2/opencv.hpp>
using namespace cv;

int main()
{

    // Load image
    Mat3b img = imread("path_to_image");
    {
        // BGR color space

        // Setup ranges
        Scalar low(182, 204, 168);
        Scalar high(187, 207, 172);

        // Get binary mask
        Mat1b mask;
        inRange(img, low, high, mask);

        // Initialize result image (all black)
        Mat3b res(img.rows, img.cols, Vec3b(0, 0, 0));

        // Copy masked part to result image
        img.copyTo(res, mask);

        imshow("Mask from BGR", mask);
        imshow("Result from BGR", res);
        waitKey();

    }

    {
        // HSV color space

        // Convert to HSV
        Mat3b hsv;
        cvtColor(img, hsv, COLOR_BGR2HSV);

        // Setup ranges
        Scalar low(72, 43, 204);
        Scalar high(72, 45, 207);

        // Initialize result image (all black)
        // Get binary mask
        Mat1b mask;
        inRange(hsv, low, high, mask);

        // Initialize result image (all black)
        Mat3b res(img.rows, img.cols, Vec3b(0, 0, 0));

        // Copy masked part to result image
        img.copyTo(res, mask);

        imshow("Mask from HSV", mask);
        imshow("Result from HSV", res);
        waitKey();
    }

    return 0;
}

面具的例子:

enter image description here

分割图像的示例:

enter image description here