c++ - OpenCV 只返回红色形状图像

标签 c++ opencv colors filter

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

#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;

}

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

我做错了什么?

谢谢

最佳答案

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

左边是我的源图像。中间只是源的红色 channel ,相当于你的canales[2]。右边是移除了所有白色 block 的红色 channel ,这是我们的目标。

Source Image Source Red Channel Only Red

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

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

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

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

您还可以采用这个仅红色 channel 并将其合并到具有全零蓝色和绿色 channel 的 BGR 图像中,以在此处为您提供输出,我认为这更清楚地表明白色像素已被删除:

Source Image Only Red

关于c++ - OpenCV 只返回红色形状图像,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/30033512/

相关文章:

java - 时间色彩理论

java - Swing UIManager.getColor() 键

c++ - 如何在不破坏连接的情况下发送和接收 SO_SNDTIMEO 和 SO_RCVTIMEO 的数据?

c++ - 无效转换、未指定行为和字符数组?

java - C++/Java递归变量初始化

algorithm - 线跟随算法 OpenCV

macos - M1 MAC 的 opencv 问题 - OpenCV imshow 不起作用

c++ - 表达式评估顺序

c++ - 视频帧上的 cvResize

c# - 使用 Random() 和颜色解释有趣的现象