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