2012-01-26 115 views
2

淺色和油漆之間存在不匹配情況:雖然物理學家會說三原色是紅色,綠色和藍色,但畫家會給紅色,藍色和黃色作爲原色。 事實上,用水彩畫進行繪畫時,不能混合紅色,綠色和藍色的黃色,而不是混合橙色,否則只會變成棕色。計算以紅色,藍色和黃色爲原色的混合顏色的RGB代碼

這裏是我想要做的事:從給定的兩個RGB顏色,我想計算RGB代碼的組合顏色,我想要的顏色融爲一體像水彩畫會在紙上。正如我理解的計算通常是這樣的:

  • #FF0000 +#0000FF =#880088((FF + 00)/ 2 = 88,(00 + 00)/ 2 = 00,(00 + FF )/ 2 = 88),所以紅色和藍色給出紫色(如它應該)
  • #FF0000 +#FFFF00 =#FF8800((FF + FF)/ 2 = FF,(00 + FF)/ 2 = 88, (00 + 00)/ 2 = 00),所以紅色和黃色給出橙色(如它應該)

然而,混合藍色和黃色時,其結果是灰色:

  • # 0000FF +#FFFF00 =#888888((00 + FF)/ 2 = 88,(00 + FF)/ 2 = 88,(FF + 00)/ 2 = 88)=灰色

預計會變綠(#008800),並且在混合顏色時不會變灰。

所以我的問題是,我該怎麼樣的交換黃綠爲原色,我怎麼可以再計算混合顏色的油漆遵循的規律,而不是那些光色?

+1

您是否看了:「[算法爲RGB值添加顏色混合](http://stackoverflow.com/questions/726549/algorithm-for-additive-color-mixing-for-rgb-values)」或「[是否有一種顏色混合算法,像混合真實顏色一樣工作?](http://stackoverflow.com/questions/1351442/is-there-an-algorithm-for-color-mixing-that-works-like-混合實時的顏色)「? – kmote

回答

1

如果您將紅色,藍色和黃色塗料混合在一起,您會看到一種黑褐色,而不是黑色。那是因爲「紅色,藍色和黃色」並不是真正的原色。青色,品紅色和黃色,這就是打印機在CMYK中工作的原因(K爲黑色)。

那麼你實際上問的是如何轉換RGB色彩CMYK,在這種情況下any of these links會幫助你。

+0

RGB被認爲是光的主要顏色,它們是http://en.wikipedia.org/wiki/Additive_color。 CMYK被認爲是油漆的主要顏色,它們是http://en.wikipedia.org/wiki/Stratractive_color。瞭解差異將有助於您理解爲什麼以及何時需要在模型之間進行轉換。 – dkamins

+0

染料的顏色一般遵循減色法的顏色規則(例如,將洋紅與青色混合會產生藍色,將藍色與黃色混合會產生相當暗的顏色),但油漆顏色不會接近。將黃色油漆與非綠色藍色(不是青色)混合,結果通常是綠色的。即使染料顏色遵守相減顏色規則可能是可疑的,除非選擇死亡是因爲它們具有可預測的相互作用能力。 – supercat

0

青色,洋紅色和黃色是它應該是什麼紅色,黃色和藍色是中世紀的習俗。

顯然,這不是一個簡單的開關,我在數學的中間睡着了,但這裏有一個方法。

RYB RGB Conversion

5

有沒有簡單的物理模型,將做到這一點,畫家的色彩與光線非常複雜的相互作用。幸運的是,我們有計算機,不限於物理世界的建模 - 我們可以讓他們做任何我們想要的任意事情!

第一步是創建與我們所需要的色調分佈,具有紅色,黃色和藍色,在120倍的增量的色輪。網絡上有很多例子。我在這裏創建了一個只有完全飽和的顏色,以便它可以用來生成完整的RGB色域。車輪上的顏色完全是任意的;我已將橙色(60°)設置爲(255,160,0),因爲紅色和黃色之間的中點太紅,我已將純藍(0,0,255)移至250°而不是240°,因此240°藍色會更好看。

RYB hue color wheel

想起我童年的實驗中,當你混合紅,黃,藍的等量在一起你會得到一個模糊的棕灰色。我選擇了一個合適的顏色,您可以在色輪的中心看到它;在代碼中我親切地稱它爲「泥」。

爲了獲得所有您想要的顏色,您需要比紅色,黃色和藍色更多的顏色,還需要混合白色和黑色。例如,您通過混合紅色和白色獲得粉紅色,並且通過將橙色(黃色+紅色)與黑色混合來獲得布朗。

該轉換適用於比率而不是絕對數字。與真正的油漆一樣,混合1份紅色和1份黃色與100份紅色和100份黃色混合沒有區別。

代碼以Python呈現,但它不應該很難轉換爲其他語言。最棘手的部分是添加紅色,黃色和藍色來創建色調角度。我使用矢量加法,並轉換回與atan2的角度。幾乎所有其他事情都通過線性插值(lerp)完成。

# elementary_colors.py 
from math import degrees, radians, atan2, sin, cos 

red = (255, 0, 0) 
orange = (255, 160, 0) 
yellow = (255, 255, 0) 
green = (0, 255, 0) 
cyan = (0, 255, 255) 
blue = (0, 0, 255) 
magenta = (255, 0, 255) 
white = (255, 255, 255) 
black = (0, 0, 0) 
mud = (94, 81, 74) 

colorwheel = [(0, red), (60, orange), (120, yellow), (180, green), 
       (215, cyan), (250, blue), (330, magenta), (360, red)] 

red_x, red_y = cos(radians(0)), sin(radians(0)) 
yellow_x, yellow_y = cos(radians(120)), sin(radians(120)) 
blue_x, blue_y = cos(radians(240)), sin(radians(240)) 

def lerp(left, right, left_part, total): 
    if total == 0: 
     return left 
    ratio = float(left_part)/total 
    return [l * ratio + r * (1.0 - ratio) for l,r in zip(left, right)] 

def hue_to_rgb(deg): 
    deg = deg % 360 
    previous_angle, previous_color = colorwheel[0] 
    for angle, color in colorwheel: 
     if deg <= angle: 
      return lerp(previous_color, color, angle - deg, angle - previous_angle) 
     previous_angle = angle 
     previous_color = color 

def int_rgb(rgb): 
    return tuple(int(c * 255.99/255) for c in rgb) 

def rybwk_to_rgb(r, y, b, w, k): 
    if r == 0 and y == 0 and b == 0: 
     rgb = white 
    else: 
     hue = degrees(atan2(r * red_y + y * yellow_y + b * blue_y, 
          r * red_x + y * yellow_x + b * blue_x)) 
     rgb = hue_to_rgb(hue) 
     rgb = lerp(mud, rgb, min(r, y, b), max(r, y, b)) 
    gray = lerp(white, black, w, w+k) 
    rgb = lerp(rgb, gray, r+y+b, r+y+b+w+k) 
    return int_rgb(rgb) 
1

我建議背棄初選的概念了,無論是RGB或RYB或CMY等

據我瞭解,你的目標是混合的顏色(即在RGB色彩空間中描述)以一種模擬油漆如何混合的方式,即減法混合。從RGB到CMY或CMYK的轉換不會很有成效,因爲您仍然需要處理減法混合計算,這在CMY空間中並不容易。

相反,讓我建議您考慮將RGB顏色轉換爲光譜反射曲線。轉換非常簡單,一旦完成,您可以做一個真正的反射率曲線的減法混合,然後將結果轉換回RGB。

還有另外一個類似的問題:https://stackoverflow.com/questions/10254022/,這個過程更詳細的討論。

+0

請儘量避免僅鏈接的答案。也許在答案中包含一個或兩個片段 – ntzm

+1

感謝@natzim,我已經修改了我的答案並提供了更多細節。 –

相關問題