【问题标题】:Randomly Generate Unique Colors?随机生成独特的颜色?
【发布时间】:2011-03-09 06:56:10
【问题描述】:

我正在使用可以绘制彩色线条 (255,255,255) 的绘图包。 所以基本上我正在做的是 (Random.Next(0,255),Random.Next(0,255),Random.Next(0,255)) 每次添加一行时生成一种颜色。

这一切都很好,但有时,我得到的颜色看起来非常相似,这使得用户很难辨别哪些数据对应于哪一行。

有没有更聪明的方法来生成 (255,255,255) 格式的随机且独特的颜色?

【问题讨论】:

  • 通过只生成一个或两个 RGB 三元组的值,而将其他两个或一个保持为零,您将生成饱和颜色——其中没有任何灰色的颜色。进一步将您的随机选择限制在 64-255 范围内,以便颜色足够浅以区分,并且您应该很好地保持颜色可区分,尽管没有更好的算法(如下所示),无法保证。

标签: c#


【解决方案1】:

是否有任何理由随机化颜色,而不是按固定顺序输出它们?我建议您使用一个索引,该索引会增加每种颜色。为颜色使用恒定(可能是最大)饱和度,亮度为 frac(indexconst1),色调为 frac(indexconst2)。我不确定如何最好地计算 const1 和 const2;这在某种程度上取决于您将获得多少分。

【讨论】:

    【解决方案2】:

    我曾经写过一个实用函数来做到这一点。

    这个想法是将 RGB 空间线性化为一维 [0, 1] 区间。例如做 (R + G*256 + B*256*256)/(256^3*256^2+256)。

    然后,每次您需要一种新颜色时,您都将先前采样生成的间隔拆分为 2。您在新空间中选择第一种颜色为 0.0,第二种颜色为 1.0,第三种颜色为 0.5,然后是 0.25,然后是 0.75等等。这有点保证,如果你生成的颜色很少,它们就会有最大的“分离”(尽管也不是根据色调来衡量的)。随着您生成的颜色越来越多,它们往往会更接近之前生成的颜色,但始终遵循最大分离原则。

    一旦获得 [0, 1] 值,就可以使用反函数(实际上是三元函数)返回 RGB。

    在基本实现中,您将白色和黑色作为前两种颜色。如果您想要不同的东西,一旦您生成了“输入”[0, 1] 值,您就可以在相同的间隔内旋转它,比如说三分之一。

    这很好用,它的行为是确定性的(没有无限的重试次数)。

    【讨论】:

    • 这是下面@phimuemue 对实现更简单的想法的概括。
    【解决方案3】:

    检查“颜色距离”

    假设 RGB 是 XYZ 坐标,进行 3D 距离计算。如果一种颜色距离所有先前生成的颜色至少 N 次,请重试。

    N 是您决定的值。

    【讨论】:

      【解决方案4】:

      假设阴影差异是坐标之间欧几里得距离的度量, 你可以
      1.记住之前生成的颜色(a,b,c)
      2. 确保下一个生成的 (x,y,z) 至少超过最大可能距离的一半
      即 sqrt [(a-x)^2 + (b-y)^2 + (c-z)^2] > 1/2 sqrt (3 * 255^2)
      3. 不断生成随机三元组,直到得到满足上述条件的三元组。如果 1/2 不够好,请尝试 2​​/3 等。强文本

      【讨论】:

        【解决方案5】:

        关于唯一性,请看here

        为了更清晰的颜色差异,您可以尝试不允许从 0 到 255 的所有可能值,而只允许一些步骤,例如0-32-64-96-128-160-192-224-255,所以你会有一点对比。

        【讨论】:

          【解决方案6】:

          一个非常简单的解决方案可能是使用更多不同的级别,例如以((Random.Next(0, 32) * 8) % 256) 为例。也许可以使用查找表来跳过已经使用过的颜色。

          【讨论】:

          • 但如果 R​​、G 和 B 都是用这种方法生成的,你最终会得到从浅到深的近灰色。
          • 是的,你说得对,应该排除一些(暗)范围,并且不应允许主值太接近(除非相等)。
          【解决方案7】:

          更好的选择是通常生成随机色调,然后使用 HSL 或 HSV 颜色(具有该色调)将色调转换为 RGB 颜色。通过使用随机“色调”而不是随机颜色,您将获得更多的颜色变化。如果您需要更多变化,您还可以随机化其他组件(饱和度/值等)。

          查看Wikipedia for details on working in colors using HSV/HSL,包括如何convert HSV to RGB

          【讨论】:

          • 如何变种更多?至少在感知上,随机色调可能接近先前的色调。你仍然需要做某种“亲密”检查
          • @Neil:是的,不能保证它是不同的(或者它不会是随机的),但是由于你是在色调而不是 RGB 之间分布随机函数,所以你要(出于实际目的)获得人眼更独特的颜色。即使您在那里添加距离检查,您也会发现“重新计算”的次数要少得多。但是,在实际应用中,这往往会提供“随机”颜色,而随机化 RGB 往往会为您提供看起来更灰暗的“随机”配色方案,而这种配色方案没有那么可区分。
          • 我认为你做了很多假设。色调如何更独特?它们都覆盖相同的色彩空间。并且,从数学上讲,由于距离检查,重新计算的可能性会降低吗?
          • @Neil:Hue 是一种“视觉属性”,根据该属性,一个区域看起来类似于一种感知颜色:红色、黄色、绿色和蓝色,或者是以下几种颜色的组合他们两个人”。通过仅随机化色调,您实际上是在专门设计用于处理感知颜色差异的投影空间中执行随机函数。您不会在数学上获得更多值,但您确实会导致单个随机函数在人类生理感知颜色差异的空间上工作。通过随机化巨大而不是尝试随机化 3 个 rgb 值......
          • @Neil:...您创建了一个随机分布,它在感知上更加独特(而不是在数学上)。有时尝试一下 - 使用随机 RGB 值,您必须非常小心,因为很容易将自己“随机化”到“灰色”颜色范围内,主要是因为人眼在高度范围内也无法感知差异饱和的、价值较低的配色方案。只是随机化色调可以避免这些颜色,这往往会使颜色“看起来”更独特(它们在数学上不那么独特 - 但实际上更有用)。
          猜你喜欢
          • 2010-10-20
          • 1970-01-01
          • 1970-01-01
          • 2010-11-13
          • 2015-11-07
          • 2012-02-19
          • 2013-04-02
          • 2018-04-02
          • 2021-05-23
          相关资源
          最近更新 更多