【问题标题】:Java: detecting a color (e.g. is my color blue?)Java:检测颜色(例如,我的颜色是蓝色吗?)
【发布时间】:2012-05-22 16:18:27
【问题描述】:

我用 Java 处理一个项目,它加载图像并查找每个像素的颜色信息。我需要在颜色定义上检测天空,这可能看起来像天空 - 使用蓝色范围。最初似乎最好使用 RGB,但这需要定义所有蓝色阴影(不可数)。我找到了分析方法,每种颜色使用 HSV 的阈值,但不知道如何分别使用颜色范围加载一些库,如何解决。感谢您的帮助。

【问题讨论】:

    标签: java hsv threshold


    【解决方案1】:

    您可以使用静态方法RGBtoHSB(...)java.awt.Color 转换为其HSV 值。然后,您可以获取色调,并将其与范围的边界进行比较 - 出于您的目的 - 构成“蓝色” - 例如

    private static final float MIN_BLUE_HUE = 0.5f; // CYAN
    private static final float MAX_BLUE_HUE = 0.8333333f; // MAGENTA
    
    public static boolean isBlue(Color c) {
      float[] hsv = Color.RGBtoHSB(c.getRed(), c.getGreen(), c.getBlue(), null);
      float hue = hsv[0];
      if (hue >= MIN_BLUE_HUE && hue <= MAX_BLUE_HUE){
        return true;
      } 
      return false;
    }
    

    我已经为MIN_BLUE_HUEMAX_BLUE_HUE 提供了一些初始值,但是您将MIN_BLUE_HUEMAX_BLUE_HUE 设置为什么取决于您愿意接受“蓝色” - 即多少绿色还是紫色的,还是可以当天空的?

    【讨论】:

    • 感谢您的回答。这是同样的问题,当我使用 RGB 时——我必须定义一系列色调、饱和度和值(或亮度)——生成蓝色的组合——来写它,这几乎是不可能的。我需要的是一些“生成器”(“库”),其中包含所有组合 - 颜色表。我用这个“表”与提到的具体像素进行比较。
    • @ZbyněkDufka:不——在 HSV 空间中,只有色调决定了它是哪种颜色。饱和度决定了颜色的“白色”程度。值/亮度决定颜色的“暗”程度。
    猜你喜欢
    • 2011-11-22
    • 1970-01-01
    • 2016-10-17
    • 2014-03-15
    • 1970-01-01
    • 2019-05-12
    • 2022-01-05
    • 2012-08-31
    相关资源
    最近更新 更多