确定对于给定的 RGB 值组合,哪种颜色(红色、蓝色、绿色或其他)可见?

Determine which color (red, blue, green or other) would be visible for a given RGB value combination?

所以基本上,我需要一种方法,我可以在其中传递红色、绿色和蓝色的值,并且该方法应该 return RGB 值的组合是否会产生明显的偏红偏绿的颜色颜色或蓝色。如果组合没有产生这三种颜色中的任何一种,它应该 return false.

我尝试使用条件语句来做到这一点,尝试了一些变体,但没有一个是准确的。

例如我试过:

if (B > 100 && B > G / 2 && B > R / 2)
{
    blueCount++;
}
else if (G > 100 && G > G / 2 && G > B / 2)
{
    greenCount++;
}
else if (R > 100 && R > G / 2 && R > B / 2)
{
    redCount++;
}

// R , G , B contains 0-255 values 

我建议使用不同的颜色spaceHSV or HSL而不是RGB

现在,要声明 color绿色 ,您必须检查

  1. 如果 color 在某些 范围内有 H (Hue) (Green 色调 占主导地位超过其他颜色)
  2. 如果 colorS (Saturation) 高于一些 阈值 为了不至于太 无色(灰色)
  3. 如果 colorVLValueLuminocity)超过某个 阈值 为了不要太(偏黑)

https://vignette.wikia.nocookie.net/psychology/images/e/e0/HSV_cylinder.png/revision/latest?cb=20071105130143

如果您将 "being color-ish" 定义为:

  • 颜色值在100以上
  • 颜色值至少是其他 2 个值的两倍
    • 您当前的代码声明“至少是其他 2 个值的 一半”,但这行不通,因为如果您有“ R:199 G:101 B:102", 你可以说它是 green-ish 因为 G 大于 100 并且超过一半的 199 和一半的 102(当它显然是 red-ish

那么您的代码看起来几乎不错(只需将 / 替换为 *)。

我只想使用 enum 作为结果:

enum Ish
{
    Other, // 0 so this would be false if you convert it to bool
    Red,   // 1
    Green, // 2
    Blue   // 3
}
if (R>100 && R>G*2 && R>B*2)
    return Ish.Red;
if (G>100 && G>R*2 && G>B*2) // you had G>G/2 here /!\
    return Ish.Green;
if (B>100 && B>G*2 && B>R*2)
    return Ish.Blue;
return Ish.Other;

我用了两次2,但我认为你可以使用其他值,只要它是>1(你不能说蓝色是主导,如果B <= R 例如)

这将是 R=100 时可能的偏红值(左图因子为 2,右图因子为 1):

这对于 R=200(左图具有因子 2,右图具有因子 1):

因此您可以使用 1 到 2 之间的因数

对于 R=200,您可以看到偏红的颜色,具体取决于以下因素:

不要为了找到一个完美准确的答案而努力。毕竟,在红色和非红色之间没有完美的界限。

我的处理方法是:首先,检查颜色是否太过 grey/black。这可以使用三个分量的总和来完成(请记住,全黑在 RGB 上是 0;0;0,灰色通常是 55;55;55)。例如,您可以认为任何颜色总和小于 300 的颜色都太暗。尝试使用任何 RGB 选择器工具找到您最喜欢的阈值。

编辑:从下面的评论中我看到三个分量的总和不起作用,例如 255;0;0 会被认为太灰。所以你必须使用三个组件的最大值。例如,20;0;0 仍然很暗,但 100;0;0 就没那么暗了。感谢@rafalon 指出这一点。

然后,您需要检查此颜色是否接近 "pure" 颜色,即红色、绿色或蓝色。为此,您需要将最突出的组件与其他两个组件进行比较。您必须分别将这个最高组件与其他两个组件进行比较。这是因为像 255;0;255 这样的颜色根本不偏红,而 255;128;128 可以这样考虑。因此,将两个不那么突出的组件组合起来是行不通的。

如果绿色和蓝色的值都低于红色的某个百分比,则您可以认为颜色偏红。以这个百分比为 50% 为例。然后,您需要检查绿色是否小于 0.5 * 红色并且蓝色是否小于 0.5 * 红色。同样,您应该尝试使用 RGB 颜色来找到您认为合适的百分比。

TL;DR:对于具有 r、g 和 b 分量的颜色,如果满足以下条件,则该颜色将是 "pure" 颜色:

  1. Max(r, g, b) > tooDarkValue

  2. r > somePercentage * Max(r, g, b) AND g > somePercentage * Max(r, g, b) AND b > somePercentage * Max(r, g, b)

请注意,对于 Max(r, g, b),第二个条件将始终为真,(任何数字大于其自身的百分比),因此无需评估哪个组件最高然后有 3 个不同的条件