确定给定的RGB值组合会显示哪种颜色(红色,蓝色,绿色或其他颜色)?

5

基本上,我需要一种方法,可以传递红色、绿色和蓝色的值,该方法应返回这些RGB值的组合是否生成一个可见的红色、绿色或蓝色。如果该组合没有生成这三种颜色之一,则应返回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 

2
这个问题有很多特殊情况,让我感到非常头疼。你会如何称呼黑色?灰色又该怎么办?当GB都是100时呢?我认为更偏向于G。 - Mark Davies
4
您可以使用 HSV 颜色模型,并检查 H(色调)和可能的 S(饱和度):如果我们拥有正确的色调(比如绿色),并且不是非常低的饱和度(不太无色如灰色、白色、黑色),我们可以说我们拥有一种绿色。 - Dmitry Bychenko
1
你可以查看这个答案 - styx
@MarkDavies “如果组合没有产生这三种颜色中的任何一种,它应该返回false” - 但我明白你的意思,应该定义何时是[红色|绿色|蓝色]-ish - Rafalon
你有没有考虑过,你的方法可以返回提供的颜色的“纯度”百分比,而不是返回true/false?例如,255;0;0是100%纯净的颜色,128;0;0是50%纯净的颜色,255;128;128也是50%纯净的颜色...我不知道,就像这样。 - CR0N0S.LXIII
3个回答

4
如果你定义“色彩感”为:
- 颜色值高于100 - 颜色值至少是另外两个值的两倍
  • 你当前的代码说明“至少是另外两个值的一半”,但这样不行,因为如果你有“R:199 G:101 B:102”,你可能会说它是绿色感,因为G高于100,并且比199和102的一半多(而实际上是红色感
那么你的代码看起来几乎正确(只需将/替换为*)。
我只会使用一个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):

Red-ish 100 fact 2 Red-ish 100 fact 1

这是R=200的情况(左图放大2倍,右图放大1倍):

Red-ish 200 fact 2 Red-ish 200 fact 1

因此,您可以使用1到2之间的因子。
对于R = 200,您可以看到下面因子的红色程度:

Red-ish 200 multifactor


1
哦...简单的数学,愚蠢的错误..谢谢指出! - kas
2
@kas 不用谢,做这件事很有趣(我扩大了最后一张截图,这样你就可以真正看到当因子低于1时会发生什么)。 - Rafalon
@kas 我也修复了你第二个 if 中的一个拼写错误 (G>G..)。 - Rafalon
你是怎么得到色彩空间图像的,@Rafalon? - Călin Darie
@CălinDarie 我实际上是用Excel VBA创建它们的(您可以在最后一张截图中看到我用于参数的两个文本框-红色值和因子),然后我使用MS Paint添加箭头和“COLOR-ish”文本。 - Rafalon

3

如果你想给颜色指定一个名称,可以参考 https://xkcd.com/color/rgb/ 并沿着列表向下查找,直到找到一个合适的匹配。 - Jeremy Lakeman

2
不要试图为此找到完全准确的答案。毕竟,在红色和非红色之间,没有所谓的完美定义线。
我会这样做:首先,检查颜色是否不太灰黑。这可以通过三个组件的总和来完成(请记住,完全黑色在RGB上是0;0;0,灰色通常是55;55;55左右)。例如,您可以认为任何组件总和小于300的颜色都太暗了。使用任何RGB选择器工具玩一下,找到您最喜欢的阈值。
然后,您需要检查此颜色是否接近“纯”颜色,即红色、绿色或蓝色。为了做到这一点,您需要将最突出的组件与其他两个进行比较。您必须单独将此最高组件与其他两个进行比较。这是因为像255;0;255这样的颜色根本不是红色,而255;128;128可以被认为是红色。因此,两个不那么突出的组件的组合行不通。
如果绿色和蓝色的值都低于红色的某个百分比,则可以考虑颜色为红色。以50%为例。然后,您需要检查绿色是否小于0.5 *红色,蓝色是否小于0.5 *红色。同样,您应该尝试一下RGB颜色,找到适合您的百分比。
对于具有组件r、g和b的颜色,如果符合以下条件,则此颜色将是“纯”颜色:
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个不同的条件。

1
“如果一个颜色的三个组成部分之和小于300,你可以认为它太暗了。” - 所以你认为255;0;0是太暗了? - Rafalon

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接