2012-11-02 214 views
3

我試圖找到一種算法,將基於%數量混合顏色。我正在進行一個選舉項目,並希望能夠以不同顏色爲每個候選人分配一個種族,然後根據候選人獲得的投票數量創建一個「結果」顏色。顏色混合超過2種顏色

這個問題:

Is there an algorithm for color mixing that works like mixing real colors?

接近我問這個問題 - 但可能我需要能夠3或4或5種顏色混合在一起。我明白這最終是一個令人難以置信的複雜問題 - 但我很好奇在兩種以上顏色上做這個建議的方法。所以,我可能有:

紅(40%),綠(10%),藍色(50%)

OR

紅(40%),黃色(5%),藍( 10%),橙色(45%)

再一次,我知道最後一個例子可能會產生某種灰色或棕色或黑色 - 這很好。我的問題是,我甚至沒有試圖解決這個問題的算法。


編輯: 那麼 - 發佈此消息後,我意識到我真正想要實現基本上是油漆顏色混合。換句話說,我不希望LIGHT顏色混合,我想模擬PAINT混合會發生什麼 - 因爲這是我保持「期待」的「可預測」結果 - 並且遇到了麻煩。

我發現這個鏈接:http://painting.about.com/library/blpaint/blcolormixingpalette1.htm

這非常密切的行爲是什麼,我要完成的 - 並暴露在我最初的想法一小「瑕疵」。所演示的是,即使我可以使用這種算法混合多達6種顏色,實際的「數據」總是被分解爲3種基色。

即便如此 - 這非常接近。

非常感謝所有對本主題做出貢獻的人 - 所有這些建議對探索這個令人驚訝的複雜問題/領域都非常有幫助。

+0

一個簡單的方法可以是簡單地通過他們的重量百分比乘以每個顏色的成分。例如,40%的紅色,60%的綠色將由0.6 0.4紅色成分和綠色成分乘以,再加入作爲正常形成。只要您的百分比合計爲100%或更少,這就保證不會裁剪任何組件。 –

+0

可能的重複[如何與C#自然混合顏色?](http://stackoverflow.com/questions/398224/how-to-mix-colors-naturally-with-c) –

回答

5

你試過簡單的加權和?

d.R = a.R*0.25 + b.R*0.25 + c.R*0.5 
d.G = a.G*0.25 + b.G*0.25 + c.G*0.5 
... 
where a, b, c are the colors you're mixing 

從我的研究,似乎沒有任何一個正確的答案,但無論似乎產生最合適的效果。此外,我不認爲簡單地混合顏色將真正指示infograph上的任何內容。你最好嘗試一下像顆粒狀的抖動http://en.wikipedia.org/wiki/Dither#Digital_photography_and_image_processing

+0

雖然*是*正確(和經典)添加劑RGB顏色混合,OP特別要求*真實*顏色混合(如油漆),所以這是行不通的。 –

+0

「真正」色彩混合的一種方法是找到各種光源的BRDF和/或各種光源的光譜功率分佈,並將它們組合,然後使用顏色匹配功能將所得光譜轉換爲RGB。我假設OP實際上想要某種快速和骯髒的近似。 – user1067042

1

這一切都取決於你的color model的原色。看起來你使用的是RGB color model,這意味着所有的顏色都可以用紅色,綠色和藍色的混合來表示。這就是說,任何顏色而不是紅色,綠色或藍色,你會分解他們的紅色,綠色和藍色的對應,然後乘以這些權重整體的權重。

在您的第二個例子:

紅(40%),黃色(5%),藍(10%),橙色(45%)

黃色和橙色需要是分解。假設你有一個橙色的Color例如,你可以這樣做:

orangeRed = o.R * .05; 
orangeBlue = o.B * .05; 
orangeGreen = o.G * .05; 

這實際上可以跨越一概而論所有Color實例(原色,只有RGB一個將有一個值)然後求和和加權平均值可以得到你的混合顏色。

,這是否會是

一個簡單的擴展方法:

static Color Mix(this IEnumerable<Tuple<Color, double>> colors) 
{ 
    // The red, green, and blue values. 
    double red = 0.0, green = 0.0, blue = 0.0; 

    // The denominator for the weighted average for a color. 
    double denominator = byte.MaxValue * 3.0; 

    // Cycle through the colors. 
    foreach (Tuple<Color, double> color in colors) 
    { 
     // Get the weighted average value for each component, and then 
     // multiply that by the weight for the color. 
     red += ((color.Item1.R/denominator) * color.Item2); 
     green += ((color.Item1.G/denominator) * color.Item2); 
     blue += ((color.Item1.B/denominator) * color.Item2); 
    } 

    // Create the color and return. 
    return Color.FromArgb((int) red, (int) green, (int) blue); 
} 
1

RGB三原色系統是壞的這樣的計算,因爲它不工作就像我們人類感知的色彩。例如,我們只是不認爲黃色是綠色和紅色的混合物。 的第一步是你的顏色轉換成在你有一個亮度協調和彩色兩個座標的色彩空間。 這可以是HLS或CIELAB。 HLS轉換更簡單,但CIELAB中的座標代表更好的人體色彩體驗。該色彩空間中的相等距離​​在人類感知中至少大致相等。

在你coordidates L該色彩空間,A和B L應爲所有的顏色相同。你的底色應該是圍繞着灰色的點了一圈,所以它們具有相同的距離,也沒有顏色比別人強。所以你基本上在飛機上有幾個點,需要計算這些點的加權中點。你將這個點轉換回RGB。實現這個