我正在使用OpenCV,我的图像有红色,黑色和白色。具体来说,它是一个由红色方块酸化的QR码。我想做的是解雇二维码,只保留红色方块。 这就是我一直在努力做的事情:
#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;
}
但是在我运行它之后,我剩下的是没有红色方块的QR码,与我想要的完全相反。
我做错了什么?
感谢
答案 0 :(得分:1)
您没有发布您正在处理的图像,因此我生成了一个随机测试图像。 (不是QR码,只是随机颜色块。)我的答案依赖于图像中只有3种颜色的事实:纯黑色,纯白色和纯红色,如下所述。其他颜色或这些颜色的阴影将需要更多的处理。
左边是我的源图片。中间只是源的红色通道,相当于您的canales[2]
。在右边是红色通道,删除了所有白色块,我们的目标。
如您所见,第二张图像在原始图像为红色或白色的任何地方都为白色。这是因为,正如@prompt在另一个答案中所说,纯白是通过将所有三个通道设置为其最大值来实现的。
黑色= BGR(0,0,0)
红色= BGR(0,0,255)
白= BGR(255,255,255)
所以我们只想要纯红色的块。通过知道我们只有红色和白色(没有洋红色或黄色或其他)我们可以采取快捷方式,只需从红色通道中减去蓝色(或绿色)中的蓝色像素:
imshow("RGB", canales[2] - canales[0]);
你也可以把这个只有红色的通道合并到一个带有全零蓝色和绿色通道的BGR图像中,在这里给你输出,我想更清楚的是白色像素已被删除:< / p>
答案 1 :(得分:0)
可能你错过了split
函数的确切功能。
它只是获取原始图像,然后创建三个分离的矢量,其中包含每个RGB通道的特定值。
原始图像中的所有内容都将显示在所有树矢量中。 什么是100%红色只会在第一个矢量中,第二个是100%绿色,第三个是100%蓝色。
但是所有这些都是白色的,因为你可能知道白色由红色的0xFF,绿色的0xFF和蓝色的0xFF组成。
我建议您使用完全符合您需要的功能inRange
。