一尘不染

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

algorithm

我正在尝试为图表控件动态生成颜色。我希望颜色在视觉上具有特色。我不仅希望这些颜色与相邻的颜色有区别,而且到目前为止还生成了所有颜色。

我也不想具有已知的颜色收集大小。我见过的一些算法需要知道一些要着色的东西。我想为我的颜色生成器实现GetNextColor(),所以在选择最终将要拥有的颜色并预先选择一个数字时我不知道。

我不仅在尝试用不同的颜色绘制一堆东西,我对这个问题感兴趣并且需要一些反馈。

我在这里:

  • 使用HSV色彩空间。
  • 色调是[0-360]中的值,其中0和360相同(带红色)。
  • 色相从0开始,我广告27(因此,当色相围绕时,色相不会与开始时的颜色相同),请采用MOD 360。
  • 对于S和V(介于0和1之间),我从一个较低的数字开始,例如.25
  • 通过大约20种色调
  • 然后取一个高数字,如.85
  • 贯穿20种色调
  • 然后开始平分,以获取尚未使用的最远的值。

这不是一个非常有效的方法,它可以正常工作,但是可能更加科学。它开始时经过很多思考,然后演变为混乱。

有关如何优雅地进行此操作的任何想法?

(没关系,但是我正在使用C#,当我回到计算机时,我会把所有这些东西都贴在上面。)


阅读 192

收藏
2020-07-28

共1个答案

一尘不染

我认为您的问题应分为两个问题:

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

现在的答案:

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

但是,差异公式是高度非线性的。因此,不可能将颜色映射到正方形网格中,以至于欧几里得距离将产生CIEDE2000色差。

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

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

我相信您最好的策略是将多维数据集分为8个多维数据集,这将产生27个点。使用这些要点。现在将8个多维数据集中的每一个划分为另外8个多维数据集。对于每个多维数据集,已经使用了27个点中的12个,因此剩下15 * 8个新点。在每个附加步骤n中,您可以生成15 * 8 ^ n个附加点。

每个步骤中设置的点应进行排序,以使两个连续点之间的最小距离最大化。

2020-07-28