javafx - 如何判断颜色是否为绿色?
问题描述
确定 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% 的误报率并不令人满意。
一个准确的公式将不胜感激!
解决方案
问题已解决!
这是该方法中的一个简单的数学错误:
public boolean isGreen(Color color){
return (color.getGreen() > 0.8*(color.getBlue()) && color.getBlue() > color.getRed());
}
color.getGreen() > 0.8*(color.getBlue()
实际上可以允许蓝色多于绿色,并且因此color.getBlue() > color.getRed()
可以允许红色多于绿色,从而导致偶尔出现紫色。
正确的方法是
public boolean isGreen(Color color){
return ((color.getBlue() < 0.8*color.getGreen())
&& (color.getRed() < .64 * color.getGreen()));
}
您需要比较的不是确保最小的绿色,而是确保最大的蓝色和最大的红色。以前,绿色以蓝色为基础,红色以蓝色为基础,而正确的方法是将蓝色和红色与绿色基础进行比较。
推荐阅读
- ubuntu - 处理由于 cuda/nvidia 而损坏的 dpkg
- parallel-processing - 了解 CL_DEVICE_MAX_WORK_GROUP_SIZE 限制 OpenCL?
- python - 如何检测python ctypes加载的共享对象
- python - 循环如何在 python 的列表分配中工作?
- windows - docker 中的云指挥官抛出错误“spawn wmic ENOENT”
- python - 多输入模型无法处理输入
- c++ - 为什么重载的运算符可以返回其返回类型以外的其他内容?
- c# - .NET Core Web API 异步方法
- reactjs - 如何在功能组件的选择标签中使用 defaultValue?
- c# - C# - 批处理文件输出不显示“按任意键继续...”直到我按下一个键