python - 将 RGB 转换为 HLS 并返回

标签 python colors rgb 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

输出:

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

绿色值相差超过 200%

我尝试了一些其他值,每次其中一个组件都会出现很大的偏差。我错过了什么吗?

最佳答案

您的值远远超出了色彩空间的范围。

来自 the docs :

Coordinates in all of these color spaces are floating point values. In the YIQ space, the Y coordinate is between 0 and 1, but the I and Q coordinates can be positive or negative. In all other spaces, the coordinates are all between 0 and 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 的并且非常易读.

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

关于python - 将 RGB 转换为 HLS 并返回,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/15442285/

相关文章:

algorithm - 颜色生成函数

python - 如何确定 python 中当前和上周的开始日期?

python - open 如何处理上下文管理?

ubuntu - 从代码块打印后记 - 非常奇怪的输出

javascript - 一个 Random(r, g ,b) 颜色生成器

android - 将位图数组转换为 YUV (420planar)?

python - 防止函数或文件用 Nose 运行?

python - 使用 turtle 模块递归(Python 3.1)

c# - 使用 VALUE 作为单元格颜色

java - graphics.setColor(颜色);不工作