【发布时间】:2021-05-15 16:48:19
【问题描述】:
判断 rgb 代码是否为绿色的公式是什么? 这是一个尝试:
public boolean isGreen(Color color){
return (color.getGreen() > 0.8*(color.getBlue()) && color.getBlue() > color.getRed());
}
也就是说,如果 rgb 的绿色值远大于蓝色,并且蓝色大于红色,则返回 true。 对其准确性进行了测试。
方法: JavaFX 程序每 6 秒生成 132 个球体,每个球体的 rgba(在这种情况下与 alpha 无关)值为
(Math.random(), Math.random(), Math.random(), Math.random())
程序打印isGreen(randomColor())的结果。
然后,作者在四个象限之一中对结果进行了统计:
-
isGreen()返回 true,但颜色感觉不是绿色 -
isGreen()返回 true,颜色是感知上的绿色。 -
isGreen()返回 false,但颜色在感知上是绿色的。 -
isGreen()返回 false,颜色不是感知上的绿色。
如果颜色不是绿色,它可以令人满意地预测:正确率为 72/99,即 73%。 足够了;此外,如果程序错误地将颜色预测为绿色,而不是错误地丢弃绿色,对程序的影响更大。
相反,它无法预测颜色是否为绿色。它预测正确率为 13/31,即 42%。 这是关键部分,它不起作用。 58% 的误报率并不令人满意。
非常感谢您提供准确的公式!
【问题讨论】:
-
我会说,如果 g 数显着高于 r 和 b,则颜色为绿色的可能性更大。只是我的猜测,我不知道这是否适用于大多数情况。
-
这看起来更像是一个统计学习问题。如果您将颜色划分为主观上是绿色和非绿色的颜色,您可以运行支持向量机算法(或者可能是回归树,尽管我在这里有点超出我的专业领域)。请注意,这种确定确实是主观的;不同的人会以不同的方式感知颜色。
-
还要注意
color.getGreen() > 0.8 * color.getBlue()并没有真正测试“RGB 的绿色值是否远大于蓝色”。例如,如果蓝色是 0.5,绿色是 0.45,那就是真的。你的意思是把 green 乘以 0.8 吗? -
@James_D 谢谢,是的,这很明显!这就是问题的全部。
标签: javafx colors rgb color-theory