将RGB转换为HLS并返回

use*_*594 7 python rgb colors color-space

我正在使用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
Run Code Online (Sandbox Code Playgroud)

输出:

(0.16666666666666666, 96.5, -1.0) (191.99999999999994, 192.0, 1.0)
Run Code Online (Sandbox Code Playgroud)

绿色值超过200%

我尝试了其他一些值,并且每次其中一个组件都会大量关闭.我错过了什么吗?

aba*_*ert 18

你的价值观超越了色彩空间的界限.

来自文档:

所有这些颜色空间中的坐标都是浮点值.在YIQ空间中,Y坐标介于0和1之间,但I和Q坐标可以是正数或负数.在所有其他空间中,坐标都在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
Run Code Online (Sandbox Code Playgroud)

这会给你:

192.0 64.0 1.0
Run Code Online (Sandbox Code Playgroud)

如果你想了解为什么当你走出色彩空间的界限时你会遇到如此荒谬的错误.

好吧,首先,阅读从文档链接的两个文档,以了解为什么颜色空间之外的值是无意义的,以及为什么要求它为不可能的约束生成值.然后,为了弄清楚为什么它以它的方式而不是其他方式失败,你需要知道它正在使用哪种算法 - 这非常简单,因为文档链接到源代码,这是纯Python并且非常易读.

(PS,我可以想象9650%的亮度可能会是什么样子,但我很好奇-100%的饱和度.可能是Lovecraftian.)