2009-05-18 8 views
16

Ich möchte eine Liste von Farbspezifikationen in Form von (r, g, b) Tupeln erzeugen, die das gesamte Farbspektrum mit beliebig vielen Einträgen überspannen. Also für 5 Einträge würde ich so etwas will:Generieren von Farbbereichen in Python

  • (0, 0, 1)
  • (0, 1, 0)
  • (1, 0, 0)
  • (1, 0,5 1)
  • ,
  • (0, 0, 0,5)

natürlich, wenn es mehr Einträge als Kombination von 0 und 1 sollte es drehen Fraktionen zu verwenden, etc. Was ist der beste Weg wäre, zu tun Dies?

Antwort

38

Verwenden Sie den HSV/HSB/HSL-Farbraum (drei Namen für mehr oder weniger die gleiche Sache). Erzeugen Sie N Tupel, die gleichmäßig im Farbtonraum verteilt sind, und wandeln Sie sie dann in RGB um.

Beispielcode:

import colorsys 
N = 5 
HSV_tuples = [(x*1.0/N, 0.5, 0.5) for x in range(N)] 
RGB_tuples = map(lambda x: colorsys.hsv_to_rgb(*x), HSV_tuples) 
+0

Richtig, das ist was ich will, aber wie erzeuge ich diese Tupel? :) –

+3

Einfach, das ist nur eine einfache lineare Serie. Ich habe oben einen einfachen Beispielcode eingegeben, als eine Möglichkeit, dies zu tun. – kquinn

+1

Cool, dann mit colorsys.hsv_to_rgb bekomme ich genau das, was ich brauche :). [colorsys.hsv_to_rgb (x * 1,0/N, 0,5, 0,5) für x im Bereich (N)]. –

7

Ich habe die folgende Funktion basierend auf kquinn's Antwort.

import colorsys 

def get_N_HexCol(N=5): 

    HSV_tuples = [(x*1.0/N, 0.5, 0.5) for x in xrange(N)] 
    hex_out = [] 
    for rgb in HSV_tuples: 
     rgb = map(lambda x: int(x*255),colorsys.hsv_to_rgb(*rgb)) 
     hex_out.append("".join(map(lambda x: chr(x).encode('hex'),rgb))) 
    return hex_out 
+0

Ich suchte nach diesem (y). Aber in meinem Fall gab es nicht viel Licht, nachdem ich gesehen hatte, dass sie hinzugefügt wurden, um ein Spektrum zu bilden. Die Ausgabe sieht so aus [Spectrum] (https://postimg.org/image/qspiz6c4h/) Ich brauche etwas mehr Helligkeit. – ln2khanal

+0

Der hsv-Raum ist Farbton, Sättigung, Wert, so dass eine Sättigung, die näher an 1 liegt, stärkere Farben ergibt und ein Wert, der näher an 1 liegt, die Helligkeit erhöht. –

+0

Kennt jemand den besten Weg, um dies auf Py3 zu aktualisieren? So etwas wie: 'hex_out.append (" ". Join (liste (map (lambda x: chr (x) [2:], rgb))))? – kuanb

2

Im Anschluss an die Schritte kquinn der und jhrf :)

Für Python 3 kann auf folgende Weise erfolgen:

def get_N_HexCol(N=5): 
    HSV_tuples = [(x * 1.0/N, 0.5, 0.5) for x in range(N)] 
    hex_out = [] 
    for rgb in HSV_tuples: 
     rgb = map(lambda x: int(x * 255), colorsys.hsv_to_rgb(*rgb)) 
     hex_out.append('#%02x%02x%02x' % tuple(rgb)) 
    return hex_out 
0

Farbpaletten interessant sind. Wussten Sie, dass die gleiche Helligkeit von, sagen wir, Grün intensiver wahrgenommen wird als, sagen wir, Rot? Schauen Sie sich http://poynton.ca/PDFs/ColorFAQ.pdf an. Wenn Sie vorkonfigurierte Paletten verwenden möchten, haben Sie einen Blick auf seaborn's palettes:

import seaborn as sns 
palette = sns.color_palette(None, 3) 

Erzeugt 3 Farben aus der aktuellen Palette.

Verwandte Themen