生成独特的颜色

时间:2009-04-21 15:37:37

标签: algorithm visualization color-space

我想在纹理中绘制一些数据:连续多个项目。它们不是按顺序创建的,它们可能都是不同的大小(想想内存堆)。每个数据项都是一个小矩形,我希望能够区分它们,所以我希望每个数据项都有独特的颜色。

现在我可以使用rand()生成RGB值并希望它们都不同,但我怀疑我不会在RGB空间中获得良好的分布。有比这更好的方法吗?例如。什么是在它们(几乎)重复之前循环通过不同颜色的好方法?

颜色不必与项目中的任何数据匹配。我只是希望能够看到许多值,并且看到它们是不同的,因为它们是相邻的。

我可以解决一些问题,但我认为这是一个有趣的问题。 :)

6 个答案:

答案 0 :(得分:13)

使用RGB颜色模型不是获得良好色彩混合的好方法。最好使用另一种颜色模型来生成颜色,然后从该颜色模型转换为RGB。

我建议使用HSV or HSL颜色模型,特别是要改变Hue

如果您想要X不同的颜色值,请将它们从0改为360,步长为360除以X.

答案 1 :(得分:4)

一般来说,RGB不是用于做这些事情的很好的色彩空间,因为对于初学者来说,它在感知上是非线性的。这意味着RGB三联体之间移动的等距离与我们的眼睛看起来并不相同。

我可能在L*c*h*空间(see also)空间或HSL空间工作,只是在色调中生成一个均匀的间距。这些空间的设计大致是感性线性的。

答案 2 :(得分:3)

你的样品空间是什么......我们说的是多少物品。

你可以从

建立一个RGB三元组数组
for(int r = 0; r < 255; r = r+16)
   for(int g = 0; g < 255; g = g+16)
      for(int b = 0; b < 255; b = b+16)
           // take r, g, b and add it to a list

然后随机化你的列表并迭代它。 在重复的颜色之前,它会给你16 ^ 3(4096)种不同的颜色。

答案 3 :(得分:2)

Google“delta e cie 2000”;色差公式可用于确定2种颜色之间的明显(视觉)距离。 (在显示器上;有一个不同的颜料配方。)它在Lab空间中运行颜色(支持simon),但应用感知计算差异。

我们发现大约1.5的数字足以确保视觉上不同的颜色(即,如果它们彼此靠近,你可以区分它们),但是如果你想要可识别的颜色(您可以在图例中找到任何颜色),您需要将其加大。

关于创建一组颜色...我可能从Lab空间的某个角落开始,然后使用步长大小来走动它,这会产生足够大的视觉差异(注意:它不是线性的,所以步长会可能必须是自适应的)然后随机化列表。

答案 4 :(得分:0)

这与有关着色地图的四色问题非常相似,这可能会为您提供一些有趣的解决方案:

Four colour theorem

答案 5 :(得分:0)

如果您只需要一组感知上不同的颜色(而不是生成它们的算法),我在我的网站上创建了一个免费工具: http://phrogz.net/css/distinct-colors.html

该工具不是仅仅使用RGB或HSV空间中的均匀间距(相对于人类感知不均匀分布),而是允许您在HSV空间中生成值网格,然后使用CMC(I:c)标准因为颜色距离会丢弃感觉上彼此太接近的颜色。 (第二个选项卡上的“阈值”滑块允许您控制颜色的视觉区别,实时显示结果。)

最后,您可以按照各种标准对生成的颜色列表进行排序,然后均匀地“混洗”该列表,以确保您在列表中具有彼此相邻的视觉上不同的值。 (我建议'交错'值大约为5。)

在撰写本文时,该工具适用于Chrome,Safari和(通过垫片)Firefox; IE9不支持HTML5范围输入滑块,UI广泛用于交互式探索。