将RGB转换为HLS及其反向转换
我正在使用Python的colorsys库把RGB颜色值转换成HLS。为了验证一下,我又把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 个回答
35
你的数值远远超出了颜色空间的范围:
根据文档:
这些颜色空间中的坐标是浮点数值……在所有其他空间(除了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%的饱和度很感兴趣。可能会有点像洛夫克拉夫特的风格。)