2013-03-15 373 views
6

我使用python的colorsys庫將RGB顏色值轉換爲HLS。爲了驗證,我嘗試轉換回RGB,並獲得了不同的值。由於精確度問題,我可以理解細微的差異,但這些值有顯着不同。將RGB轉換爲HLS並返回

這裏是我的代碼:

import colorsys 
r=192 
g=64 
b=1 

hlsval = colorsys.rgb_to_hls(r,g,b) 
rgbval=colorsys.hls_to_rgb(hlsval[0],hlsval[1],hlsval[2]) 

print hlsval, rgbval 

輸出:

(0.16666666666666666, 96.5, -1.0) (191.99999999999994, 192.0, 1.0) 

綠色值是關閉的,每次都超過200%

我嘗試了一些其他的價值,以及組件之一已經有很大的數量了。我錯過了什麼嗎?

+1

值? – 2013-03-15 21:27:50

+2

@AshwiniChaudhary:很顯然,他在某處有相當於'a,b,c = r,g,b'的位置(或者他沒有忘記編輯他的代碼來使用'r,g,b'而不是'a,b,c'或者其他),因爲這些就是你用'a,b,c = 192,64,1'得到的值。 – abarnert 2013-03-15 21:35:58

+0

對,對不起。我現在糾正了它。 – user2175594 2013-04-22 03:59:02

回答

15

你的價值觀是超越色彩空間範圍的方式。

the docs

座標在所有這些色彩空間是浮點值。在YIQ空間中,Y座標在0和1之間,但I和Q座標可以是正值或負值。在所有其他空間中,座標都在0和1之間。

我猜你期望它們是0到255之間的字節值?如果你想了解爲什麼你這樣可笑的錯誤,當你去使用的色彩空間的邊界之外的方式

192.0 64.0 1.0 

:只要通過255先分:

r, g, b = 192, 64, 1 
r, g, b = [x/255.0 for x in r, g, b] 
h, l, s = colorsys.rgb_to_hls(r, g, b) 
r, g, b = colorsys.hls_to_rgb(h, l, s) 
r, g, b = [x*255.0 for x in r, g, b] 
print r, g, b 

這會給你。

首先,閱讀文檔鏈接的兩個文檔,瞭解顏色空間以外的值是什麼意思,以及爲什麼要求它爲不可能的約束生成值。然後,爲了弄清楚爲什麼它以某種方式失敗,你需要知道它使用哪種算法 - 這很容易,因爲文檔鏈接到源代碼,這是純Python,並且非常易讀。

(PS,我可以想像9650個%亮度可能看起來像,但我很好奇約-100%的飽和度。可能是一些拉夫克拉夫特)了``B`和`C`的`