首页 > 解决方案 > 如何判断颜色是否为绿色?

问题描述

确定 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()).

然后,作者在四个象限之一中对结果进行了统计:

  1. isGreen()返回 true,但颜色在感知上不是绿色
  2. isGreen()返回 true,并且颜色在感知上是绿色的。
  3. isGreen()返回 false,但颜色在感知上是绿色的。
  4. isGreen()返回 false,并且颜色在感知上不是绿色。

如果颜色不是绿色,它可以令人满意地预测:正确率为 72/99,即 73%。足够了; 此外,如果程序错误地将颜色预测为绿色,而不是错误地丢弃绿色,则对程序的影响更大。

相反,它无法预测颜色是否为绿色。它预测正确率为 13/31,即 42%。这是关键部分,它不起作用。有 58% 的误报率并不令人满意。

一个准确的公式将不胜感激!

这是一个图表来说明当前的结果: 在此处输入图像描述

标签: javafxcolorsrgbcolor-theory

解决方案


问题已解决!

这是该方法中的一个简单的数学错误:

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()));
    }

您需要比较的不是确保最小的绿色,而是确保最大的蓝色和最大的红色。以前,绿色以蓝色为基础,红色以蓝色为基础,而正确的方法是将蓝色和红色与绿色基础进行比较。


推荐阅读