操作 CIE xyY 或 XYZ 颜色时如何处理负值?

问题描述 投票:0回答:1

我正在编写一些图像处理代码来进行一些创造性的色域限制,我想将其用于颜色分级应用程序。我正在构建在 Davinci Wide Gamut 色彩空间中操作,通常使用 DaVinci Intermediate logarithmic 编码 ,因为这是我在色彩管理工作流程中的典型工作空间。为此,我想将输入转换为 xyY,限制 xy 的值以适合我所需的色域,然后转换回达芬奇宽色域/中级。

这些是我正在执行的步骤:

  1. 将 DaVinci Intermediate RGB 转换为线性 RGB
  2. 乘以 DWG 到 XYZ 转换矩阵。
  3. 将 XYZ 转换为 xyY。
  4. 修改 x 和 y 以使其落入色域内。
  5. 将 xyY 转换为 XYZ。
  6. 乘以 XYZ 到 DWG 转换矩阵。
  7. 将线性 RGB 转换为 DaVinci Intermediate。

这对于大多数情况都适用,我还验证了不修改 x 和 y 的往返可以按预期工作。对于极度饱和的蓝色会出现这个问题。以达芬奇广色域/中间色中的以下 RGB 值为例:

[0, 0, 1.0]
让我们一起来看看吧:

  1. 转换为线性:
    [0, 0, 100]
  2. 转换为 XYZ:
    [10.11,-14.78, 132.59]
  3. 转换为 xyY:
    [0.08,-0.12,-14.78]
  4. 修改 x 和 y 以适应我的色域:
    [0.18, 0.07, -14.78]
  5. 转换回 XYZ:
    [-35.64,-14.78,-149.08]
  6. 转换回 DWG 线性:
    [-27.99,-27.99,-117.44]
  7. 转换回达芬奇中级:
    [-292.34, -292.34, -1226.52]

如您所见,结果是无意义的,但仅限于这些极端的蓝色值。对我来说,很明显这是由达芬奇广色域中的蓝色原色引起的,它具有负 y 坐标 (

[0.0790, -0.1155]
)。这会导致负亮度 (
Y = -14.78
),并且当弄乱 xy 值而不同时处理亮度时,事情就会变得混乱。

以这种方式进行色域限制时,如何处理 xyY 和 XYZ 中的负值?

colors color-space davinci
1个回答
0
投票

步骤 2

XYZ < 0
?? Afaik CIELAB XYZ 应始终 >= 0。 您还有其他 XYZ 吗 < 0 ?
例如,网络上有很多 RGB <-> XYZ 公式和代码片段

# https://python-colormath.readthedocs.io/en/latest/conversions.html

from colormath.color_objects import sRGBColor, LabColor, XYZColor
from colormath.color_conversions import convert_color

print( 80 * "▄" )

c = [ 0., 0., 1. ]
rgb = sRGBColor( *c )
lab = convert_color( rgb, LabColor )  # .lab_l .lab_a .lab_b
xyz = convert_color( rgb, XYZColor )  # .xyz_x .xyz_y .xyz_z
print( "rgb:", c )
print( lab )
print( xyz )

# rgb: [0.0, 0.0, 1.0]
# LabColor (lab_l:32.2994 lab_a:79.1914 lab_b:-107.8655)
# XYZColor (xyz_x:0.1805 xyz_y:0.0722 xyz_z:0.9504)  # 0 - 1, not XYZ100
© www.soinside.com 2019 - 2024. All rights reserved.