如何从RGB值中区分可见颜色

6
我正在开展一项图像分析项目,需要检查多张图片中设置位置的RGB值,并且需要确定某个区域是绿色还是蓝色。最初我认为可以通过测试RGB中G是否大于B来实现,但我意识到在绿色图像中,由于与红色混合,蓝色可能比绿色更多。有没有可能根据RGB确定颜色的外观,可能是一个公式或算法?

只是猜测,但将其转换为Luv或Lab颜色空间可能会有所帮助。 - MalaKa
@MalaKa,我对这两个都不熟悉。可以提供链接吗? - Jayjey
此外,HSL颜色空间。 - copeg
@Jayjey,我也不知道这些颜色空间的细节。我所知道的是它们应该更接近于人类的感知。L只描述了亮度,而另外两个值则描述了在两个轴上的颜色。作为进一步研究的起点,这里提供luv空间的维基链接:http://en.m.wikipedia.org/wiki/CIELUV - MalaKa
有一个非常好的来自微软MIX09大会的演讲,叫做《为开发人员设计基础》(我找不到副本了),Robby Ingebretsen在演讲中说“每个程序员都应该转换到HSV,因为这是程序员大脑看待颜色的方式。H代表颜色的频率(除了它的S饱和度或者V亮度)。” - Jason Sperske
1个回答

5
你可以使用 Color 类的 RGBtoHSB 方法将 RGB 值转换为 HSB 值。转换后的色相值介于0-1之间,其中绿色 (0,255,0) 的色相值为0.33,蓝色 (0,0,255) 的色相值为0.66。
float[] hsb = Color.RGBtoHSB(0, 255, 0, null);//green
System.out.println(hsb[0]);
hsb = Color.RGBtoHSB(0, 0, 255, null);//blue
System.out.println(hsb[0]);

您可以根据这个创建一个色调值的度量标准,例如任何色相值 < 0.5 都比蓝色更接近绿色。

下面是一张图像,展示了颜色在此颜色空间中如何变化,其中X轴表示色相(请注意,在此图片中,色相的变化范围为0-360度,而 RGBtoHSB 返回值的范围为0-1)。

enter image description here


运行得非常好!对于任何正在查看的人,我发现我的绿色值更接近于.6,而蓝色值更接近于.9,因此>.5测试可能并不总是能得到正确的结果。 - Jayjey
并不是每个人都以相同的方式看待颜色,甚至如果他们这样做了,也可能会给它们分配不同的名称。特别是绿色和蓝色之间的边界。如果你找到一个认为某物是蓝色而你认为它是绿色或反之亦然的人,那么就会有争论产生;-) - Erwin Bolwidt
Jayjey,你是怎么找到那些值的呢? - Jürgen K.

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接