2012-12-30 52 views
5

如果我有RGB值:255, 165, 0,可以做些什麼來計算218, 255, 0255, 37, 0的類似顏色,但仍然適用於任何RGB顏色?用python計算類似顏色

例如:

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

編輯:爲了簡單起見,類似的顏色可以被看作是這一點,綠色是輸入顏色,那麼藍綠色和黃色的綠色作爲輸出:
http://www.tigercolor.com/Images/Analogous.gif

+0

什麼是類似的顏色?它是如何計算的? – inspectorG4dget

+5

看起來您可以將RGB轉換爲HSL,旋轉+/- 30度,然後將這兩種新顏色轉換回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

要獲得這些類似的顏色,我們考慮在RGB顏色直接表示RYB顏色,然後從RYB轉換爲RGB。例如,假設RGB中有一個三元組(255,128,0)。調用這個三重RYB三元組並轉換爲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)