2011-07-27 125 views
3

我有一個複雜的問題,但它可以通過這個小問題來解決。我想製作一種着色劑,每個像素都有效。如何通過HSL顏色着色?

我對圖片的定義基色(畫面上有這個顏色和許多其他的像素,這是接近這種顏色的多個像素):

Hex: #188DD9 
HSL: 204° 80% 47% 
RGB: 24 141 217 

我知道我的目標底色

Hex: #23752E 
HSL: 128° 54% 30% 
RGB: 35 117 46 

所以,我想着色圖像。

我的假設是,如果我找到這兩個HSL值的相關性,我可以 逐個像素地着色我的圖片。

目前我發現,如果我移動基準色調(目標色調 - 基色調)= -76,色調就會很好。

您能指導我解決這個問題,飽和度和亮度之間的關係在哪裏?

回答

2

我假設,無論您最終使用哪種映射,您都想將黑色映射到黑色,白色映射到白色,灰色映射到灰色。

添加劑映射

H」 = H +(H 目標 - ħ)您用於色調

(具有迴繞)確實是可能的罰款。對於飽和度,需要保存灰度值提供一個乘法映射

S」 = S *(S 目標/S

與超過100%飽和度限幅的值。然而,對於亮度,線性地圖不會去做,因爲你想在調整中間值的同時修正0%和100%的亮度。自然選擇可能改爲是gamma型地圖,即

L」 = POW(L,日誌(L 目標)/日誌(L ))= EXP(日誌(L)* log(L target)/ log(L base))。

其中亮度值被調整爲0和1之間(注:爲了有效地計算出本地圖大量像素,你可能要預先計算的,也就是說,256個條目的查詢表。)

當然,還有很多其他地圖可以使用,但我會先從這些地圖開始,看看它們是否能夠提供足夠好的結果。請注意,最終,結果的質量也可能受到HSL色彩空間的感知不均勻性的限制;有關詳細信息,請參閱this Wikipedia page

+0

謝謝!它運行良好。我只做了一次改進。對於接近最終顏色(紅色或綠色或藍色)的某些目標值,着色之後出現錯誤的顏色。改進是:如果(S> Sbase)S = Sbase;在計算S' –

+0

你是否首先嚐試使用if(S'> Smax)S'= Smax;',其中Smax是最大有效飽和度(通常類似於1.0,100或255)。 PS。我建議使用長整數或浮點數進行中間計算,否則可能會因算術溢出而陷入困境。另外,如果使用整數,記得在分割之前先進行乘法運算。 –

+0

不,我沒試過。現在我嘗試了,它產生了相同的結果,您的解決方案是合乎邏輯的。 :) 再次感謝你! –