从线性RGB转换为XYZ

时间:2017-09-09 16:15:38

标签: c++ data-conversion standards-compliance color-space

此矩阵应该从线性 RGBA转换为XYZ,保留alpha通道:

vec4 M[4]=
    {
     vec4{0.4124564f,0.3575761f,0.1804375f,0.0f}
    ,vec4{0.2126729f,0.7151522f,0.0721750f,0.0f}
    ,vec4{0.0193339f,0.1191920f,0.9503041f,0.0f}
    ,vec4{0.0,0.0f,0.0f,1.0f}
    };

这是对的吗?我在哪里可以找到双精度值?我问,因为第二行非常接近亮度公式,根据我的理解,这与非线性sRGB值有关:

vec4 weights{0.2126f,0.7152f,0.0722f,0.0f};
auto temp=m_data*weights; //vectorized multiplication
return temp[0] + temp[1] + temp[2] + temp[3]; //Sum it up to compute the dot product (weighted average)

其他问题:讨论的权重是否应该相同?转换为Y' CbCr应该使用相同的权重吗?它应该在线性或sRGB空间中执行吗?

1 个答案:

答案 0 :(得分:1)

此矩阵从sRGB flavor 转换为CIE XYZ D65。然而,这不是 IEC 61966-2-1:1999 中公布的官方sRGB矩阵,其四舍五入为4位数字如下:

$ iex --sname node2@localhost
Erlang/OTP 20 [erts-9.0] [source] [64-bit] [smp:4:4] [ds:4:4:10] [async-threads:10] [hipe] [kernel-poll:false]

Interactive Elixir (1.5.1) - press Ctrl+C to exit (type h() ENTER for help)
iex(node2@localhost)1> Node.spawn(:"node1@localhost", fn -> IO.puts("Run on #{Node.self}") end)
#PID<9960.95.0>
Run on node1@localhost

根据您执行转换的上下文,使用官方的 IEC 61966-2-1:1999 矩阵来获取与其他第三方数据集的匹配结果可能很重要他们将使用规范矩阵。

此处参考是使用Colour计算的双精度转换矩阵:

[[ 0.4124  0.3576  0.1805]
 [ 0.2126  0.7152  0.0722]
 [ 0.0193  0.1192  0.9505]]

用于生成它的代码:

[[0.412390799265960 0.357584339383878 0.180480788401834]
 [0.212639005871510 0.715168678767756 0.072192315360734]
 [0.019330818715592 0.119194779794626 0.950532152249661]]
  

讨论的权重是否应该相同?

为了保证计算的一致性,您可能希望使用与矩阵匹配的权重,否则在来回转换时会遇到问题。

  

转换为Y'CbCr应该使用相同的权重吗?

Y'CbCr有很多变种,如果你不知道你需要哪种变种,没有人能够正确回答。

  

是应该在线性还是sRGB空间中执行?

Y'CbCr转换几乎总是在伽马编码值中发生,ITU-R BT.2020 YcCbcCrc是一个值得注意的例外,因为它基于线性编码值。同样重要的是要理解sRGB色彩空间也是线性的,事实上,这里讨论的核心矩阵应该应用于线性编码的sRGB值。

可能会在另一个新问题中提出最后两个问题。