色彩逻辑算法

时间:2010-01-20 17:16:39

标签: java javascript algorithm colors

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

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

我想要做的是检查两个团队颜色是否在彼此的特定范围内,以便我不会显示两种相似的颜色。

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

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

由于

7 个答案:

答案 0 :(得分:40)

这是theoretical explanation

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

答案 1 :(得分:25)

以下是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);
} 

答案 2 :(得分: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> = threshold ^ 2

答案 3 :(得分:5)

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

所以我会将颜色映射从RGB转换为色调,饱和度和亮度级别,然后只检查色调值是否有足够的距离。

Wikipedia has an explanation for converting RGB to HSV. LiteratePrograms has some sample code.

答案 4 :(得分:4)

Wikipedia详细介绍了许多可用于此目的的算法。

此前还有StackOverflow问题:Finding an accurate “distance” between colors

答案 5 :(得分:2)

从算法的角度来看,这非常简单。每种颜色代表3D空间中的一个点,颜色之间的差异是这些点之间的距离。

据推测,这里的要点是确保颜色明显不同。如果是这种情况,决定最小距离可能会相当困难。问题是(至少对于视力正常的人来说)一些差异比其他人更容易看到。例如,大多数人对绿色阴影的微小差异比对红色或蓝色阴影的同样小的变化更敏感。有一些算法可以考虑到这一点,但它们是基于人类的平均视觉,所以没有一个能保证对任何一个人都是正确的。

为了好玩,您可能需要查看X-rite's online color vision test

答案 6 :(得分:0)

我使用了第一批答复中给出的算法,尽管结果直到我找到DeltaE库之后才达到预期,该库可以更好地计算颜色之间的距离。

用于Node.js,请检查here