5

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

所以我必须找到一种方法来将 255 * 255 * 255 种颜色均匀且逻辑地划分为 16 种颜色的 rgb 调色板。

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

4

7 回答 7

7

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

色相、饱和度、值

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

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

但感谢不同的方法

于 2010-09-05T01:10:44.737 回答
3

您基本上是将立方体 (RXGXB) 投影到正方形 (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 种基本颜色,例如浅色和深色或饱和和不饱和。

于 2010-09-04T22:47:12.707 回答
3

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

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

于 2010-09-04T23:47:18.963 回答
3

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

于 2010-09-04T23:53:29.333 回答
2

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

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

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

可能还有更多算法。但是我用过这3个。

于 2010-09-05T01:10:35.467 回答
2

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

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

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

于 2010-09-04T23:39:47.407 回答
1

从颜色作为明显数学的整数开始(或者如果您能以 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
于 2019-09-13T04:05:45.267 回答