我正在尝试生成一个有 16 种颜色的调色板。我将在 4x4 网格中显示此调色板。
所以我必须找到一种方法来将 255 * 255 * 255 种颜色均匀且逻辑地划分为 16 种颜色的 rgb 调色板。
我认为这将是一个数学算法。因为我想从 3x3 矩阵中选择 16 个向量,这些向量是等比例的。
实际上我找到了一种方法取决于这个“划分调色板”问题。我将使用此颜色值将 rgb 值转换为 hsv 值。
色相、饱和度、值
所以我可以使用 0-360 之间的一个整数值,或者我可以使用 0-100 (%) 之间的一个整数作为我的调色板。
最后,我可以轻松地使用这些值根据颜色选择来搜索/过滤我的数据。我将 0-360 范围内的颜色平均分为 16 种颜色,因此我可以轻松定义 16 种不同的颜色。
但感谢不同的方法
您基本上是将立方体 (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 种基本颜色,例如浅色和深色或饱和和不饱和。
您可以将其视为纯粹的数学均分问题,但实际上与颜色无关。
如果您尝试以对人类感知有意义的方式对调色板进行均分,则需要考虑大量非线性,本文仅提及。例如,颜色#fffffe
、#fffeff
和#feffff
占据数学空间的较远角落,但人眼几乎无法区分。
当所选颜色的数量 (16) 非常少时(尤其是与可用颜色的数量相比),您最好手动挑选好看的调色板或使用标准调色板(如一些预定义的系统)或用于 16 种颜色系统的 Web 调色板),而不是试图发明一种数学算法来选择调色板。
这是一个标准问题,称为颜色量化。有几种算法可以解决这个问题:
目标:您基本上希望在 3 个轴从 0 到 255 变化的 3 维空间中创建 16 个像素簇。
方法是: 1) 第一个有效位的舍入。-- 很容易实现,但效果不佳。2)直方图法。- 采取中等努力并给出更好的结果 3)四叉树。- 最先进的数据结构。给出最好的结果,但很难实现 qaud 树数据结构。
可能还有更多算法。但是我用过这3个。
很大程度上取决于颜色的用途。我只想要 16 种有点随意的颜色,我建议:
黑色 深灰色 浅灰色 白色 深红色 深绿色 深蓝色 深黄色 medred medgreen medblue medyellow 浅红色 浅绿色 浅蓝色 浅黄色
我用那个颜色设置了一个有点卡通色彩的游戏(VGA),发现它工作得很好。我想我对颜色的排序略有不同,但如果排列成 4x4 正方形,上面的顺序似乎是合乎逻辑的。
从颜色作为明显数学的整数开始(或者如果您能以 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