色彩逻辑算法

Ste*_*eve 25 javascript java algorithm colors

我们正在构建一个体育应用程序,并希望将团队颜色合并到应用程序的各个部分.

现在每个团队都可以用几种不同的颜色来表示.

我想做的是执行检查以验证两个团队颜色是否在彼此的特定范围内,以便我不显示两个相似的颜色.

所以,如果团队1的主要团队颜色的值为rgb(255,0,0)(或#FF0000),团队2的主要颜色相似,比如rgb(250,0,0),那么我们会选择不同的颜色其中一支球队的颜色.

如果可能的话,我可以采取什么方法来执行检查?

谢谢

pgr*_*ras 42

这是一个理论上的解释

和C中的算法:

typedef struct {
    unsigned char r, g, b;
} RGB;

double ColourDistance(RGB e1, RGB e2)
{
    long rmean = ( (long)e1.r + (long)e2.r ) / 2;
    long r = (long)e1.r - (long)e2.r;
    long g = (long)e1.g - (long)e2.g;
    long b = (long)e1.b - (long)e2.b;
    return sqrt((((512+rmean)*r*r)>>8) + 4*g*g + (((767-rmean)*b*b)>>8));
}
Run Code Online (Sandbox Code Playgroud)


Blu*_*eft 27

这是Java中的pgras算法:

public double ColourDistance(Color c1, Color c2)
{
    double rmean = ( c1.getRed() + c2.getRed() )/2;
    int r = c1.getRed() - c2.getRed();
    int g = c1.getGreen() - c2.getGreen();
    int b = c1.getBlue() - c2.getBlue();
    double weightR = 2 + rmean/256;
    double weightG = 4.0;
    double weightB = 2 + (255-rmean)/256;
    return Math.sqrt(weightR*r*r + weightG*g*g + weightB*b*b);
} 
Run Code Online (Sandbox Code Playgroud)

  • @sam_k:代码应该写成易于阅读.当你的意思是"除以256"时写">> 8"并没有明确指出意图,这使得它更难理解.有些人这样做的原因是他们相信(错误地)它使代码更快.它没有 - 即使是最愚蠢的优化器也足够聪明,可以自动进行优化. (7认同)

Ham*_*jan 5

我将使用两种颜色之间的3d距离,其中x,y,z是R,G,B值.

看看这个Perl库:

http://metacpan.org/pod/Color::Similarity::RGB

这很容易实现.

只要确保(R1-R2)^ 2 +(G1-G2)^ 2 +(B1-B2)^ 2> =阈值^ 2

  • 是的,我会说两种颜色看起来有多相似(而不是它们的相似程度),我会使用pgras算法.人眼远非完美:我们对绿色比对红色或蓝色更敏感,我们的亮度感知是对数等. (2认同)

Mr.*_*rna 5

此问题的大多数答案将建议在将RGB值映射到3D空间时计算两种颜色之间的距离.该技术的问题在于具有相似色调但不同饱和度或亮度水平的两种颜色可以在3D RGB空间中比具有不同色调但具有非常相似的饱和度和亮度水平的两种颜色更远地彼此映射.换句话说,蓝色和绿色在3D RGB空间中可能比红色的两个阴影更接近.在此应用中,确保团队颜色不同,色调差异的重量应远大于亮度和饱和度.

因此,我将颜色映射从RGB转换为色调,饱和度和亮度级别,然后仅检查色调值是否有足够的距离.

维基百科有一个将RGB转换为HSV的解释. LiteratePrograms有一些示例代码.