【问题标题】:Use mask in opencv to detect color similarity在opencv中使用掩码检测颜色相似度
【发布时间】:2020-01-24 06:19:05
【问题描述】:

cv::Mat3b bgr = cv::imread("red_test.png");

cv::Mat3b hsv;
cvtColor(bgr, hsv, cv::COLOR_BGR2HSV);

cv::Mat1b mask1, mask2;
inRange(hsv, cv::Scalar(0, 70, 50), cv::Scalar(10, 255, 255), mask1);
inRange(hsv, cv::Scalar(170, 70, 50), cv::Scalar(180, 255, 255), mask2);

cv::Mat1b mask = mask1 + mask2;

为了检测图像中的红心,应用了上面的代码,它提供了 2 个蒙版图像,即“mask1”和“mask2”。然后,我通过按像素进行 OR 操作来组合为两个红色范围生成的蒙版。生成以下输出。

我需要知道的是:是否可以使用输出图像来检测其他样本图像中的红色? (忽略心形,它只是我感兴趣的颜色)。

【问题讨论】:

  • 掩码只包含一个等效于每个像素的布尔值,因此您无法仅从中检测颜色。
  • 还有其他方法可以使用吗?
  • 您到底想做什么?提取 hsv 图像的蒙版部分的颜色?请编辑您的答案以澄清。

标签: c++ image opencv image-processing rgb


【解决方案1】:

想发表评论,但实际上无法格式化。

我现在无法运行你的代码,但是通过阅读它我有一些 cmets

  1. 输出只是输入图像的二进制掩码。它可用于遮盖输入图像中的红色心形,否则它只是与其他图像无关的二值图像。我会说它对不同的形状没有任何好处。从理论上讲,您可以使用它从原始图像计算颜色模型,但它不会让您获得任何结果,因为该模型只会让您回到初始阈值值(170:10 度红色,参见第 2 点)。
  2. 您生成的两个蒙版代表您正在搜索的颜色,可用于您想要在 170:10 度范围内找到红色的任何图像,并进一步限制饱和度和值。仅这些二进制掩码就会告诉您指定范围内是否有任何像素。
  3. 现在,如果您想查找图像中是否有红色,您可以使用生成的mask 并将像素值相加,或者使用 ````cv::sumorcv:: countNonZero```函数,看看结果是否大于0。
  4. 要获取红色对象的更多参数,您需要做更多工作,但您制作的蒙版是一个好的开始,但您的问题只是检测,所以不确定您是否想要任何形态

尝试在具有多种颜色的任何图像上运行您的代码,它会为给定范围内的任何红色生成遮罩。

【讨论】:

    猜你喜欢
    • 2014-11-14
    • 1970-01-01
    • 2018-08-10
    • 2017-11-09
    • 2015-03-20
    • 1970-01-01
    • 1970-01-01
    • 2023-03-13
    相关资源
    最近更新 更多