2

我正在迭代多边形标志。我有 128 个独特的 tham。我想知道如何为每个获得可区分的颜色(以便每个标志或多或少具有可区分的颜色)?如何从一个整数中获得这样的 RGB 整数?

拥有一个基于框架的模型东西是rand()%255, rand()%255, rand()%255没有意义的,而为每个可验证的存储颜色不是我想要的。255-i变化不提供可区分的结果。所以我寻求一种算法来从 given 中获得可区分的颜色i

我有一个迭代器iunsigned long long128 位掩码 ( 0001, 0010, 0100...)。

4

6 回答 6

3

128 个数字是 7 位的数据。我会将 7 位划分为 (2, 2, 3) 并使用这些(按某种顺序)作为红色、绿色和蓝色的高阶位。这应该在 RGB 颜色空间中尽可能地分散颜色。

于 2013-03-20T08:19:05.920 回答
2

简单地使用网格 r=4, g=8, b=4 很容易,但不一定会产生最佳输出,因为深色中的不同色调应该较少。

实验室空间中的处理将在每个单元之间具有最相等的感知距离,但我相信可以从 YUV 或 HSV 中找到合理的替代方案。

仅从评估其他答案的启发式/结果(我将尝试从游戏开发者网站找到最佳副本),我认为最好的结果来自立方以外的其他格。

   X   X   X
 X   X   X   X  <-- e.g. sampling points from hexagonical grid in HSV cone
   X   x   X    for some intensity level L.
 X   X   X   X
   X   X   X

IMO的典型错误是将下一级 L+-1 与 L 对齐;相反,如果将下一个强度级别 L+-1 中的采样点旋转(45 度),则附近颜色的色调和强度都会有所不同。这个想法的另一个名称是为附近的颜色提供良好的汉明距离。

     x   x  L&1==0,    x    L&1==1
       *             x   x
     x   x             x

同样在 HSV 锥体中,将有一种黑色、一种白色、三种深色色调、三种亮色色调、下一个强度级别的 6 或 12 种颜色等。

游戏开发者回答中的第二个优秀评论是文化偏见。我更愿意将这个概念表述为我们赋予某些颜色以含义,并且可以很好地区分鼠尾草橄榄色薰衣草紫红色的颜色。

编辑链接中的第一个答案有 173 个赞成票,即使我无法区分颜色 5 和 6。而且只有 10 种颜色。但该理论声称是合理的。

于 2013-03-20T09:03:49.977 回答
1

生成最佳不同颜色的调色板并不容易。既然你说你需要固定数量的颜色,你可以只预生成一种颜色,例如这里:

http://tools.medialab.sciences-po.fr/iwanthue/

于 2013-03-20T08:24:32.387 回答
1

如果你真的需要生成这些,而不是使用预先生成的调色板,我至少建议不要在 RGB 中工作。

例如,Lab 颜色空间与人类视觉系统的关系更密切,因此在尝试寻找感知上不同的颜色时可能更合适。

因此,您可能会尝试在 Lab 中生成相距较远的颜色,然后再转换回 RGB。

于 2013-03-20T08:30:16.023 回答
1

这取决于您想要以下内容的不同程度。

如果您发现在运行时创建颜色太难了,那么如何在您知道不同的托盘中创建预定义颜色的查找?

于 2013-03-20T08:17:58.183 回答
0

这个怎么样:

int get_red(int rep){
    int x,r=0,i,temp;
    i=0;
    temp=rep;
    while(temp!=0){
        i++;
        if(i==3) r=temp%2;
        temp=temp/2;
    }
    if(i>3) x=(long long int)255/(i-2);
    else x=255;
    temp=r*x;
    return temp;

}

int get_green(int rep){
    int x,g=0,i,temp;
    i=0;
    temp=rep;
    while(temp!=0){
        i++;
        if(i==2) g=temp%2;
        temp=temp/2;
    }
    if(i>3) x=(long long int)255/(i-2);
    else x=255;
    temp=g*x;
    return temp;
}

int get_blue(int rep){
    long long int x,b=0,i,temp;
    i=0;
    temp=rep;
    while(temp!=0){
        i++;
        if(i==1) b=temp%2;
        temp=temp/2;
    }
    if(i>3) x=(int)255/(i-2);
    else x=255;
    temp=b*x;
    return temp;
}
于 2013-11-03T05:26:23.897 回答