【问题标题】:Is there any way to divide rgb color palette?有没有办法划分rgb调色板?
【发布时间】:2011-04-08 08:04:34
【问题描述】:

我正在尝试生成一个有 16 种颜色的调色板。 我将在 4x4 网格中显示此调色板。

所以我必须找到一种 rgb 调色板的方法 255*255*255色均分16色,逻辑合理。

我认为这将是一个数学算法。 因为我想从中挑选 16 个向量 等比例选取的 3x3 矩阵。

【问题讨论】:

  • 您试图从 3D 空间中挑选 16 个向量,每个维度有 255 个元素。这不是 3x3 矩阵。这也很难统一完成,因为 3 不是 16 的除数(如果是这样的话,这将是微不足道的) 可能有一些来自色彩理论的东西来拯救。就目前而言,我觉得这是一个球体填充问题。
  • 或者更确切地说,是球体堆积问题的一种变体(实际上有点相反,您希望将 16 个球体放在 3D 空间中尽可能远离彼此。
  • 是的,你是对的,我实际上并不擅长这个,我认为这个问题有一些方法/已知的解决方案。你听说过这种事吗?
  • 好吧,这似乎不是一个微不足道的问题,但不用想太多,为什么不创建一个包含 16 个分量的色相和饱和度的线性向量呢?我的意思是 1 x 16 并向他们展示一个 cuadricule?

标签: algorithm math colors palette divide


【解决方案1】:

实际上我找到了一种方法取决于这个“划分调色板”问题。 我将使用此颜色值将 rgb 值转换为 hsv 值。

色相、饱和度、值

所以我可以使用 0-360 之间的一个整数值,或者我可以使用 0-100 (%) 之间的一个整数作为我的调色板。

最后,我可以轻松地使用这些值根据颜色选择搜索/过滤我的数据。我将 0-360 范围内平均分为 16 种颜色,因此我可以轻松定义 16 种不同的颜色。

但感谢不同的方法

【讨论】:

  • 但是,正如 supercat 所建议的那样,您可能希望将色调和值的差异结合起来,因为单独产生难以区分的 24 位颜色项目。
【解决方案2】:

当所选颜色的数量 (16) 非常少时(尤其是与可用颜色的数量相比),您最好手动挑选好看的调色板或使用标准调色板(比如一些预- 为 16 种颜色系统定义系统或 Web 调色板),而不是试图发明一种数学算法来选择调色板。

【讨论】:

  • +1 我认为这是最好的解决方案。我已经进行了均分处理,这很丑陋。只需亲自挑选它们。
  • 是的,我更喜欢这样做,但实际上我要将此调色板集成到搜索逻辑中,所以我会选择一种数学方式
【解决方案3】:

您基本上是将一个立方体 (R X G X B) 投影到一个正方形 (4 X 4) 上。首先,我会先问自己该正方形内适合什么尺寸的立方体。

1 X 1 X 1 =  1
2 X 2 X 2 =  8
3 X 3 X 3 = 27

适合正方形的最大立方体有 8 种颜色。在这一点上,我会注意到 8 是 16 的整数因子是多么方便。

我认为方便会诱使我在 2 种变体中使用 8 种基本颜色,例如浅色和深色或饱和和不饱和。

【讨论】:

  • 没关系。均匀分布 8 个元素和 16 个元素一样难。
【解决方案4】:

您可以将其视为纯粹的数学均分问题,但实际上它与颜色无关。

如果您尝试以对人类感知有意义的方式对调色板进行均分,则需要考虑大量非线性,this article 仅提及。例如,颜色#fffffe#fffeff#feffff 占据了数学空间的较远角落,但人眼几乎无法区分。

【讨论】:

  • 你作为例子给出的三种颜色是围绕原点聚集的;)虽然是点。
  • 你只是在向后编号你的轴;)虽然点。
【解决方案5】:

很大程度上取决于颜色的用途。我建议你只想要 16 种有点随意的颜色:

黑色 深灰色 浅灰色 白色 深红色 深绿色 深蓝色 深黄色 medred medgreen medblue medyellow 浅红色 浅绿色 浅蓝色 浅黄色

我将该颜色设置用于一个有点卡通色彩的游戏 (VGA),发现它运行良好。我想我对颜色的排序略有不同,但如果将上面的顺序排列成一个 4x4 的正方形,那么上面的顺序似乎是合乎逻辑的。

【讨论】:

    【解决方案6】:

    这是一个标准问题,称为颜色量化。 有几种算法可以解决这个问题:

    目标:您基本上希望在 3 个轴从 0 到 255 变化的 3 维空间中创建 16 个像素簇。

    方法有: 1) 第一个有效位的舍入。 -- 很容易实现,但效果不佳。 2)直方图法。 - 采取中等努力并给出更好的结果 3)四叉树。 - 最先进的数据结构。给出最好的结果,但实现 qaud 树数据结构很困难。

    可能还有更多算法。不过这3个我都用过。

    【讨论】:

      【解决方案7】:

      从颜色作为整数开始,以进行明显的数学运算(或者如果您可以以 16 为基数思考,则以十六进制开头)。将每个所需样品的编号添加到颜色中。将颜色整数转换为十六进制,然后将十六进制拆分为 RGB。在此代码示例中,最后一种颜色将在十六进制白色 (0xffffff) 的分割数内。

      # calculate color sample sizes
      divisions = 16      # number of desired color samples
      total_colors = 256**3-1
      color_samples = int((total_colors) / divisions)
      print('{0:,} colors in {1:,} parts requires {2:,} per step'.format(total_colors, divisions , color_samples))
      # loop to print results
      ii = 0
      for io in range(0,total_colors,color_samples):
          hex_color = '{0:0>6}'.format(hex(io)[2:])
          rc = hex_color[0:2]  # red 
          gc = hex_color[2:4]  # blue 
          bc = hex_color[4:6]  # green  
          print('{2:>5,} -  {0:>10,} in hex {1} | '.format(io, hex_color, ii), end='')
          print('r-{0} g-{1} b-{2} | '.format(rc, gc, bc), end='')
          print('r-{0:0>3} g-{1:0>3} b-{2:0>3}'.format(int(rc,16), int(gc,16), int(bc,16)))
          ii +=1
      

      【讨论】:

        猜你喜欢
        • 2020-07-24
        • 1970-01-01
        • 2021-11-12
        • 2011-12-16
        • 2022-06-10
        • 1970-01-01
        • 2020-08-29
        • 2020-06-28
        相关资源
        最近更新 更多