我正在使用 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 ,这是我们的目标。
如您所见,在原始图像为红色或白色的地方,第二个图像为白色。那是因为,正如@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 图像中,以在此处为您提供输出,我认为这更清楚地表明白色像素已被删除:
关于c++ - OpenCV 只返回红色形状图像,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/30033512/