【问题标题】:Match all green colors in HLS匹配 HLS 中的所有绿色
【发布时间】:2015-11-26 21:07:44
【问题描述】:

我正在尝试匹配 HLS(色相亮度饱和度)中的所有绿色,但没有多大成功。我必须创建一个只包含青椒的图像。来源图片:

我所需要的只是 H、L 和 S 之间的特定部分/依赖关系。我在互联网上搜索过这个但我失败了:(。

为此,我在 Java 中使用 OpenCV。我当前的代码(部分):

private double lsRatio(HLS hls) {
    return hls.getL() / hls.getS();
}

private boolean isCondition(HLS hls) {
    return hls.getS() >= 0 && lsRatio(hls) > 0.8 && lsRatio(hls) < 5 && (hls.getH() <= 120 || hls.getH() >= 80);
}

对于这种情况,我得到:

如您所见,仍有一些红色。

感谢您的帮助。

【问题讨论】:

  • 您的 HLS 计算似乎有误。红色显然不在 80 - 120 色相范围内。或者它实际上在 0-2pi 范围内或 0-1 左右,
  • 你的意思是我在将 RGB 转换为 HLS 时遇到问题?
  • 是的。这是我的猜测。那些红色根本不符合你的条件。它们大约是 0 色相。
  • 好的,但是我使用 OpenCV 的内置函数 Imgproc.cvtColor(source, hlsMat, Imgproc.COLOR_BGR2HLS);请注意,在条件结束时,我使用的是替代,而不是连词。
  • @camickr 感谢您的帮助,但我找到了答案 here :)

标签: java image opencv colors


【解决方案1】:

我认为转换为 HLS 很好。我尝试使用HSL Color 转换并得到相同的结果。

(hls.getH() <= 120 || hls.getH() >= 80)

这将包括所有颜色。 (包括红色——即 0 小于 120)。您的其他条件正在过滤掉大部分阅读音调/阴影。

我尝试了一些更简单的方法:

private boolean isCondition(HLS hls)
{
    if (hls.getH() < 60 || hls.getH() > 140)
        return false;

    return true;
}

我最初尝试了 80 - 120 的范围,但它错过了很多颜色。可能 60 -140 包含太多非绿色颜色,在这种情况下,您可以尝试应用其他条件来排除更多颜色。

【讨论】:

  • 哎呀,是的 h = 80 表示“任何色调”,也许将其更改为 &amp;&amp; 是我们一直忽略的秘诀。
  • @zapl,这就是我在回答中的建议。如果你确实使用了&amp;&amp; 条件,那么其他条件就没有意义了。
猜你喜欢
  • 2018-03-31
  • 1970-01-01
  • 2015-09-29
  • 1970-01-01
  • 2020-06-10
  • 1970-01-01
  • 2020-07-30
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多