Выбор цветов, которые находятся дальше друг от друга - PullRequest
1 голос
/ 07 июля 2010

Я работаю над проектом, который требует, чтобы я выбрал «уникальные» цвета для каждого элемента. Время от времени может быть более 400 предметов. Есть ли какой-нибудь выход из выбора 400 цветов, которые больше всего отличаются? Это так просто, как просто изменить значения RGB с фиксированным шагом?

Ответы [ 3 ]

3 голосов
/ 07 июля 2010

Можно придумать равное распределение 400 цветов, увеличивая красный, зеленый и синий по очереди на 34.

То есть:

  • Вы знаете, что у вас есть три цветовых канала: красный, зеленый и синий
  • Вам нужно 400 различных комбинаций R, G и B
  • Таким образом, для каждого канала число приращений, которое вам нужно, равно корню куба, то есть около 7,36
  • Чтобы охватить диапазон 0..255 с шагом 7,36, каждый шаг должен составлять около 255 / 7,36, т.е. около 34
0 голосов
/ 08 июля 2010

Вот мой окончательный код. Надеюсь, это поможет кому-то в будущем.

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
0 голосов
/ 07 июля 2010

Вероятно, HSL или HSV будет лучшим представлением, чем RGB для этой задачи.

Вы можете обнаружить, что изменение оттенка дает лучшее восприятие изменчивости для глаза, поэтому отрегулируйте свои приращения втаким образом, что для каждых единиц X, измененных в S и L, вы меняете Y (с Y

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...