代码之家  ›  专栏  ›  技术社区  ›  Steve

颜色逻辑算法

  •  23
  • Steve  · 技术社区  · 15 年前

    我们正在构建一个体育应用程序,并希望在应用程序的各个部分加入球队颜色。

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

    我要做的是执行一个检查,以验证两种团队颜色是否在彼此的某个范围内,这样我就不会显示两种相似的颜色。

    因此,如果团队1的主要团队颜色的值为rgb(255,0,0)(或ff0000),并且团队2的主要颜色类似,例如rgb(250,0,0),那么我们将为其中一个团队选择不同的颜色。

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

    谢谢

    6 回复  |  直到 15 年前
        1
  •  39
  •   pgras    15 年前

    这里是一个 theoretical explanation

    以及C中的algo:

    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));
    }
    
        2
  •  25
  •   Alp    12 年前

    下面是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);
    } 
    
        3
  •  5
  •   Mr. Berna    15 年前

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

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

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

        4
  •  5
  •   szabgab Brandon Fosdick    10 年前

    我将使用两种颜色之间的三维距离,其中x,y,z是r,g,b值。

    看看这个Perl库:

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

    这很容易实现。

    只需确保(r1-r2)^2+(g1-g2)^2+(b1-b2)^2>=阈值^2

        5
  •  4
  •   Community CDub    7 年前

    Wikipedia 详细介绍了一些可以用于此目的的算法。

    还有前面的stackoverflow问题: Finding an accurate “distance” between colors

        6
  •  2
  •   Jerry Coffin    15 年前

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

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

    只是为了好玩,你可能想看看 X-rite's online color vision test .