2012-05-22 217 views
2

我在Java中处理一个项目,该项目加载图像并查找每个像素的颜色信息。我需要使用蓝色范围来检测颜色定义上的天空,看起来像天空。最初似乎最好使用RGB,但这需要定义所有蓝色(不可数)的色调。我发现了分析方法,其中每种颜色都使用HSV阈值,但不知道如何使用颜色范围加载一些库,以及如何解决这些问题。谢谢你的帮助。Java:检测颜色(例如,我的颜色是蓝色的吗?)

回答

3

您可以使用静态方法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到将取决于你愿意接受为“蓝色” - 即有多少绿色或紫色莫不是是的,它仍然可以接受的天空?

+0

感谢您的回答。同样的问题是,当我使用RGB时 - 我必须定义一系列色调,饱和度和值(或brigthess) - 使蓝色变为蓝色的组合 - 来编写它,这几乎是不可能的。我需要的是一些“发电机”(“库”),其中包含所有组合 - 颜色表。这个“表”我用于比较具体的像素与提到如果。 –

+0

@ZbyněkDufka:否 - 在HSV空间中,只有色调决定了它的颜色。饱和度决定了颜色的“白色”。价值/亮度决定了颜色如何“黑暗”。 – amaidment

+0

@ZbyněkDufka - c.f. http://en.wikipedia.org/wiki/HSL_and_HSV – amaidment