有没有办法划分rgb调色板?

时间:2010-09-04 22:27:31

标签: algorithm math colors palette divide

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

所以我必须找到一种rgb调色板的方法 255 * 255 * 255种颜色从逻辑上划分为16种颜色。

我认为这将是一种数学算法。 因为我要从中挑选16个向量 3x3矩阵,以相同的比例选取。

7 个答案:

答案 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