2012-12-30 25 views
5

RGB値が255, 165, 0の場合、218, 255, 0255, 37, 0の類似の色を計算するには何ができますか?例えば類似の色をPythonで計算する

>>> to_analogous(0, 218, 255) 
[(0, 255, 165),(0, 90, 255)] 

EDIT:簡潔にするために、類似した色は、このように表示することができ、緑色入力される色は、青、緑、黄緑が出力される。

http://www.tigercolor.com/Images/Analogous.gif
+0

類似の色は何ですか?どのように計算されますか? – inspectorG4dget

+5

RGBからHSLへの変換、+/- 30度の回転、そして2つの新しい色のRGBへの変換ができるようです。簡単な変換関数のためにcolorsysモジュールをチェックしてください。 – BenTrofatter

答えて

8

RGBからHSLへの変換と+/- 30度の回転は確かにあなたが望むものかもしれませんが、カラーホイールが表示されません。それぞれの取得、12と128色、(上部)純粋な赤で始まる、これはあなたが得るものです:

enter image description hereenter image description here

そしてここでは、類似した色を生成するためのサンプルコードです:

import colorsys 

DEG30 = 30/360. 
def adjacent_colors((r, g, b), d=DEG30): # Assumption: r, g, b in [0, 255] 
    r, g, b = map(lambda x: x/255., [r, g, b]) # Convert to [0, 1] 
    h, l, s = colorsys.rgb_to_hls(r, g, b)  # RGB -> HLS 
    h = [(h+d) % 1 for d in (-d, d)]   # Rotation by d 
    adjacent = [map(lambda x: int(round(x*255)), colorsys.hls_to_rgb(hi, l, s)) 
      for hi in h] # H'LS -> new RGB 
    return adjacent 

他のカラーホイールは減法混色系を考慮して得られたものです。そのために、簡単にRYBの色空間を考えてみましょう(これは典型的な学校のアートクラスで学んだ色の組み合わせを表しています)。それを使用することにより、我々はすぐに次の車輪を得る:

enter image description hereenter image description here

これらの類似色を得るために、我々は直接RYBで色を表現して、RGBにRYBから変換するRGBで色を検討してください。たとえば、RGBでトリプル(255,128,0)があるとします。 RYBトリプルを3回トリプルし、RGBに変換して(255,64,0)を取得します。このRYB→RGB変換は、複数の定義があるという点でユニークではなく、私はGossetとChenの "Paint Inspired Color Compositing"のものを使用しました。変換を実行するコードは次のとおりです。

def _cubic(t, a, b): 
    weight = t * t * (3 - 2*t) 
    return a + weight * (b - a) 

def ryb_to_rgb(r, y, b): # Assumption: r, y, b in [0, 1] 
    # red 
    x0, x1 = _cubic(b, 1.0, 0.163), _cubic(b, 1.0, 0.0) 
    x2, x3 = _cubic(b, 1.0, 0.5), _cubic(b, 1.0, 0.2) 
    y0, y1 = _cubic(y, x0, x1), _cubic(y, x2, x3) 
    red = _cubic(r, y0, y1) 

    # green 
    x0, x1 = _cubic(b, 1.0, 0.373), _cubic(b, 1.0, 0.66) 
    x2, x3 = _cubic(b, 0., 0.), _cubic(b, 0.5, 0.094) 
    y0, y1 = _cubic(y, x0, x1), _cubic(y, x2, x3) 
    green = _cubic(r, y0, y1) 

    # blue 
    x0, x1 = _cubic(b, 1.0, 0.6), _cubic(b, 0.0, 0.2) 
    x2, x3 = _cubic(b, 0.0, 0.5), _cubic(b, 0.0, 0.0) 
    y0, y1 = _cubic(y, x0, x1), _cubic(y, x2, x3) 
    blue = _cubic(r, y0, y1) 

    return (red, green, blue) 
関連する問題