【问题标题】:How to Judge if a Color is Green?如何判断颜色是否为绿色?
【发布时间】: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())的结果。

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

  1. isGreen() 返回 true,但颜色感觉不是绿色
  2. isGreen() 返回 true,颜色是感知上的绿色。
  3. isGreen() 返回 false,但颜色在感知上是绿色的。
  4. 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


【解决方案1】:

问题已解决!

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

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

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

【讨论】:

  • 请注意,(0, 0.001, 0.0001) 的 rgb 基本上是黑色的,在这个定义下将是绿色。
猜你喜欢
  • 1970-01-01
  • 2020-08-29
  • 1970-01-01
  • 1970-01-01
  • 2018-04-03
  • 2015-12-06
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多