OpenCV return 仅红色形状图像

OpenCV return only red shapes image

我正在使用 OpenCV,我有一张包含红色、黑色和白色的图像。具体来说,它是一个被红色方块包围的二维码。我想做的是取消二维码,只保留红色方块。 这就是我一直在尝试做的事情:

#include <iostream>
#include <opencv2/core/core.hpp>
#include <opencv2/imgproc/imgproc.hpp>
#include <opencv2/highgui/highgui.hpp>

using namespace cv;
using namespace std;

int main(){
    Mat imagen, imagenThreshold, imagenThreshold2;
    vector<Mat> canales;
    imagen = imread("qr.ppm");
    split(imagen,canales);
    imshow("RGB", canales[2]);
    return 0;

}

但是我运行它之后,我剩下的是没有红色方块的二维码,与我想要的完全相反。

我做错了什么?

谢谢

您可能没有理解函数 split 的确切作用。

它只是获取您的原始图像,然后创建三个分离的向量,其中包含每个 RGB 通道的特定值。

原始图像中的所有白色部分都将出现在所有树向量中。 100% 红色只会在第一个向量中,100% 绿色在第二个向量中,100% 蓝色在第三个向量中。

但是在所有这些颜色中都可以看到白色,因为您可能知道白色是由红色的 0xFF、绿色的 0xFF 和蓝色的 0xFF 组成的。

我建议您使用函数 inRange 来完成您需要做的事情。

您没有 post 您正在处理的图像,因此我生成了随机测试图像。 (不是 QR 码,只是随机色块。)我的回答基于图像中只有 3 种颜色的事实:如下定义的纯黑、纯白和纯红。其他颜色或这些颜色的阴影将需要更多处理。

左边是我的源图片。中间就是源头的红色通道,相当于你的canales[2]。右边是去掉了所有白色方块的红色通道,我们的目标。

如您所见,第二张图片为白色,而原始图片为红色 为白色。那是因为,正如@prompt 在另一个答案中所说,纯白色是通过将所有三个通道设置为最大值来制作的。

Black = BGR(0, 0, 0)
Red = BGR(0, 0, 255)
White = BGR(255, 255, 255)

所以我们只想要纯红色的方块。通过知道我们只有红色和白色(没有洋红色或黄色或其他),我们可以走捷径,简单地从红色通道中减去其中含有蓝色(或绿色)的像素:

  imshow("RGB", canales[2] - canales[0]);

你也可以把这个只有红色的通道合并成一个全零蓝色和绿色通道的 BGR 图像,在这里给你输出,我认为这更清楚地表明白色像素已经被移除: