2010-07-07 87 views
1

我正在研究一個需要我爲每個項目選擇「獨特」顏色的項目。有時可能會有超過400件物品。有沒有辦法選擇400種顏色最不同的顏色?它只是簡單的改變一個固定增量的RGB值?選擇距離最遠的顏色

回答

0

大概HSL or HSV會比RGB更好的表示,此任務。

您可能會發現,改變色調可爲眼睛提供更好的變異感,因此調整增量的方式是,對於每個X單位在S和L中更改,您都更改Y(Y < X)色調單位,以及調整X和Y,以便覆蓋所需數量的樣本。

+0

我試圖用這個方法HSV。這是我想到http://pastebin.com/pDGZhBXB。唯一的問題是它不會創建400種獨特的顏色。有任何想法嗎? – blcArmadillo 2010-07-07 17:37:13

+0

我不知道,但給它一個快速瀏覽一下,貌似問題是hsv_to_rgb預計三個值是0.0和1.0之間,而你正在使用度H. HTTP://docs.python。組織/庫/ colorsys.html – bashflyng 2010-07-07 21:55:33

3

你能想出的400個色的均勻分佈通過增加紅色,綠色和藍色依次由34

即:

  • 你知道你有三個顏色通道:紅,綠色和藍色
  • 需要400個不同的R,G的組合和B
  • 所以每個通道上需要增量的數量是400的立方根,即約7.36
  • 以跨越範圍0..255與7.36的增量,每個增量必須是大約255/7.36,即約34
+0

會+1,但我跑出了upvotes。 :( – mcandre 2010-07-07 16:37:12

+0

POW(+1,1./3)upvotes就足夠了 – 2010-07-07 16:43:09

+0

+1是mcandre沒有> ;-) – smirkingman 2011-07-28 11:52:55

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