2013-03-15 379 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`的`