【问题标题】:Converting RGB to HLS and back将 RGB 转换为 HLS 并返回
【发布时间】:2013-03-04 18:01:01
【问题描述】:

我正在使用 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%

我尝试了一些其他值,但每次其中一个组件都会大幅关闭。我错过了什么吗?

【问题讨论】:

  • a,bc 的值?
  • @AshwiniChaudhary:很明显,他在某处得到了相当于a, b, c = r, g, b 的东西(或者他只是没有忘记编辑他的代码以使用r, g, b 而不是a, b, c 或其他东西),因为这些正是您使用a, b, c = 192, 64, 1 获得的值。
  • 是的,很抱歉。我现在已经改正了。

标签: python colors rgb color-space


【解决方案1】:

你的价值观远远超出了色彩空间的界限。

来自the docs

所有这些色彩空间中的坐标都是浮点值。在 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

这会给你:

192.0 64.0 1.0

如果您想了解为什么在超出色彩空间范围时会出现如此荒谬的错误。

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

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

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2018-03-05
    • 1970-01-01
    • 1970-01-01
    • 2023-03-14
    • 1970-01-01
    相关资源
    最近更新 更多