选择最远的颜色

时间:2010-07-07 16:28:20

标签: colors

我正在开展一个项目,要求我为每个项目选择“独特”的颜色。有时可能会有超过400件物品。是否有一些方法可以选择最不同的400种颜色?它只是简单地用固定的增量来改变RGB值吗?

3 个答案:

答案 0 :(得分:3)

你可以通过将红色,绿色和蓝色依次增加34来得到400种颜色的相等分布。

那是:

  • 您知道有三种颜色通道:红色,绿色和蓝色
  • 您需要400种不同的R,G和B
  • 组合
  • 因此,在每个频道上,您需要的增量数是400的立方根,即大约7.36
  • 要以7.36为增量跨越0..255范围,每个增量必须约为255 / 7.36,即约 34

答案 1 :(得分:0)

对于此任务,HSL or HSV可能是比RGB更好的表示。

你可能会发现改变色调会给眼睛带来更好的可变性感知,所以要调整你的增量,使得在S和L中每改变一个X单位就改变Y(用Y

答案 2 :(得分:0)

这是我的最终代码。希望它可以帮助有人在路上。

from PIL import Image, ImageDraw
import math, colorsys, os.path

# number of color circles needed
qty = 400

# the lowest value (V in HSV) can go
vmin = 30

# calculate how much to increment value by
vrange = 100 - vmin
if (qty >= 72):
    vdiff = math.floor(vrange / (qty / 72))
else:
    vdiff = 0

# set options
sizes = [16, 24, 32]
border_color = '000000'
border_size = 3

# initialize variables
hval = 0
sval = 50
vval = vmin
count = 0

while count < qty:
    im = Image.new('RGBA', (100, 100), (0, 0, 0, 0))
    draw = ImageDraw.Draw(im)
    draw.ellipse((5, 5, 95, 95), fill='#'+border_color)
    r, g, b = colorsys.hsv_to_rgb(hval/360.0, sval/100.0, vval/100.0)
    r = int(r*255)
    g = int(g*255)
    b = int(b*255)
    draw.ellipse((5+border_size, 5+border_size, 95-border_size, 95-border_size), fill=(r, g, b))
    del draw

    hexval = '%02x%02x%02x' % (r, g, b)

    for size in sizes:
        result = im.resize((size, size), Image.ANTIALIAS)
        result.save(str(qty)+'/'+hexval+'_'+str(size)+'.png', 'PNG')

    if hval + 10 < 360:
        hval += 10
    else:
        if sval == 50:
            hval = 0
            sval = 100
        else:
            hval = 0
            sval = 50
            vval += vdiff

    count += 1