使用未知的颜色集合大小生成视觉上不同的颜色

Jas*_*son 6 language-agnostic algorithm colors

我正在尝试为图表控件生成颜色.我希望颜色在视觉上与众不同.我不仅希望颜色与相邻颜色区别开来,而且到目前为止所有颜色都是如此.

我也不想拥有已知的颜色集合大小.我已经看到的一些算法需要知道要着色的事物的数量.我想为我的颜色生成器实现GetNextColor(),所以我不知道在选择最终会有多少颜色时,选择前面的数字会感觉不对.

我不只是试图用不同颜色绘制一堆东西,我对这个问题感兴趣并想要一些反馈.

这是我在的地方:

  • 使用HSV色彩空间.
  • 色调是[0-360]的值,其中0和360相同(偏红).
  • Hue从0开始,到第27天(所以当它循环时它不会落在它开始的相同颜色上),取MOD 360.
  • 对于S和V(都在0和1之间),我开始时的数字很低,如.25
  • 贯穿约20个色调
  • 然后拿一个像.85这样的高数字
  • 贯穿20色调
  • 然后开始二等分以获得尚未使用的最远值.

这不是一个非常有效的方法,它可以正常工作,但它可能更加科学.它开始时有很多想法,然后变成了这个烂摊子.

关于如何优雅地做到这一点的任何想法?

(这应该没关系,但我正在使用C#,当我回到计算机上时,我会发布代码,我已经掌握了所有这些内容.)

Lio*_*gan 6

我相信你的问题应该分为两个问题:

  1. 如何将颜色映射到n维笛卡尔空间,并定义颜色之间的欧几里德距离函数,使得距离反映人类观察者的差异.
  2. 给定n维立方体,生成一系列点,使得到目前为止生成的任何两个点之间的最小欧几里德距离最大化.

现在答案是:

  1. 使用CIEDE2000色差公式计算色差.所述CIEDE2000公式是基于LCH颜色空间(光度,色度和色调).LCH颜色空间表示为圆柱体(请参见此处的图像).

    但是,差分公式是高度非线性的.因此,将颜色映射到正方形网格中是不可能的,这样欧几里得距离就会给出CIEDE2000的色差.

    在不太精确的模型上,我们可以使用CIE76色差公式,该公式基于Lab色彩空间(L*a*b*).我们可以直接在这个颜色空间上使用欧几里德距离来测量差异.RGB或CMYK值与L*a*b*之间没有简单的公式转换,因为RGB和CMYK颜色模型与设备有关.首先需要将RGB或CMYK值转换为特定的绝对色彩空间,例如sRGB或Adobe RGB.此调整将取决于设备,但来自变换的结果数据将与设备无关,允许将数据转换为CIE 1931颜色空间,然后转换为L*a*b*.文章解释程序和公式.

  2. 对于L*a*b*颜色空间和CIE76色差公式 - 我们需要解决3D立方体的问题.

    我相信你最好的策略是将立方体分成8个立方体,这将产生27个点.使用这些要点.现在将8个立方体中的每一个分成另外8个立方体.对于这些立方体中的每一个,已经使用了27个点中的12个,所以你剩下15*8个新点.在每个附加步骤n中,您可以生成15*8 ^ n个附加点.

    应对每个步骤中的点集进行排序,使得两个连续点之间的最小距离最大化.我不知道怎么做 - 我刚发布了一个问题.

编辑:

我已经在https://cstheory.stackexchange.com/上进行了交叉,并得到了一个很好的答案.请参阅https://cstheory.stackexchange.com/questions/8609/sorting-points-such-that-the-minimal-euclidean-distance-between-consecutive-poin.