【问题标题】:CIELAB is gain saturating when converting to float sRGB转换为浮点 sRGB 时,CIELAB 增益饱和
【发布时间】:2016-05-20 16:21:21
【问题描述】:

我正在使用 python 的颜色匹配将 CIE L*a*b* 转换为 sRGB

输入:

(lab_l=70.0,lab_a=60.0,lab_b=0.0)

输出:

(1.0458503175786145, 0.47183611022803823, 0.682521668019042)

但是,1.045... 超出范围 12 个字节。这是预期的行为吗?

【问题讨论】:

    标签: python colors


    【解决方案1】:

    L*a*b*的色域比sRGB宽,所以转换溢出是正常的。

    L*a*b* 可以表示所有可感知的颜色,但 0 ≤ r,g,b ≤ 1 范围内的 sRGB 只是一个小子集。你的颜色就在这个子集之外。

    (另见Boundaries of the visible gamut in a CIE color space

    如果您不喜欢溢出,可以在 colormath 中使用 clamped_rgb_r, etc properties 将值限制在 [0.0, 1.0] 范围内,如 explained in the documentation on Color Conversion

    RGB 空间的色域往往比某些 CIE 色彩空间的色域更小。转换为 RGB 时,这可能会导致某些坐标最终超出可接受的范围(0.0-1.0 或 1-255,具体取决于您的 RGB 颜色是否被放大)。

    我们不会为您固定这些,而是​​保持原样。这允许更准确地转换回 CIE 颜色空间。如果您需要钳制(0.0-1.0 或 1-255)值,请对任何 RGB 颜色使用以下属性:

    • clamped_rgb_r
    • clamped_rgb_g
    • clamped_rgb_b

    例子:

    from colormath import color_objects, color_conversions
    
    lab_color = color_objects.LabColor(lab_l=70.0, lab_a=60.0, lab_b=0.0)
    rgb_color = color_conversions.convert_color(lab_color, color_objects.sRGBColor)
    print(repr(rgb_color))
    # sRGBColor(rgb_r=1.045850317578614,rgb_g=0.47183611022803845,rgb_b=0.6825216680190419)
    print((rgb_color.clamped_rgb_r, rgb_color.clamped_rgb_g, rgb_color.clamped_rgb_b))
    # (1.0, 0.47183611022803845, 0.6825216680190419)
    

    【讨论】:

    • 我应该使用上限函数进行转换吗?这将引入剪辑。
    • @noumenal 您可以使用sRGBColor.clamped_rgb_r 提取钳位值。查看更新。