将RGB转换为HLS和反向转换

17

我正在使用Python的colorsys库将RGB颜色值转换为HLS。只是为了验证,我尝试将其转换回RGB并得到了不同的值。我可以理解由于精度问题而导致的小差异,但这些值的差异很大。

这是我的代码:

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
变量 abc 的值是多少? - Ashwini Chaudhary
2
@AshwiniChaudhary:很明显他在某个地方有等价于a,b,c = r,g,b的代码(或者他只是忘记编辑他的代码使用r,g,b而不是a,b,c之类的),因为这些值正好是你用a,b,c = 192,64,1得到的值。 - abarnert
是的,对不起。我现在已经纠正了它。 - user2175594
1个回答

34

您的值明显远远超出了色彩空间的范围:

文档中可以看到:

所有这些颜色空间中的坐标都是浮点值... 除了YIQ之外的所有其他空间中,坐标都介于0和1之间

我猜想您希望它们是0到255之间的字节值?那就先除以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

这将给你:

192.0 64.0 1.0

如果您想了解为什么超出颜色空间范围后会得到如此荒谬的错误,请先阅读从文档中链接的两篇文章,以了解颜色空间之外的值是毫无意义的原因以及为什么您要求它生成不可能的约束条件的值。然后,为了确切地弄清它为什么会以这种方式失败而不是其他方式,您需要知道它使用的算法是哪个——这相当容易,因为文档链接到源代码,这是纯Python且非常易读的。

(顺便说一句,我可以想象出9650%亮度会是什么样子,但我对于-100%饱和度很好奇。可能会是某种洛夫克拉夫特风格的东西。)


好的,但这是colorsys的可用性问题,它可以愉快地处理超出颜色空间坐标而不发出警告。另一个可用性问题是它不会将结果四舍五入。 - smci

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接