从线性RGB转换为XYZ

Convert from linear RGB to XYZ

本文关键字:XYZ 转换 RGB 线性      更新时间:2023-10-16

此矩阵应该从 linearear 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}
    };

是正确的吗?我在哪里可以两倍的精度找到值?我问,因为第二行非常接近Luma公式,据我了解,这与非线性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空间中执行吗?

此矩阵从srgb straim 转换为cie xyz d65。但是,这不是IEC 61966-2-1:1999 发表在 IEC 61966-2-1中的官方SRGB矩阵,它舍入到4位,如下所示:

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

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

在这里参考是用颜色计算的双精度转换矩阵:

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

和用于生成它的代码:

import numpy as np
import colour
print(colour.models.sRGB_COLOURSPACE.RGB_to_XYZ_matrix)
np.set_printoptions(formatter={'float': '{:0.15f}'.format})
colour.models.sRGB_COLOURSPACE.use_derived_transformation_matrices(True)
print(colour.models.sRGB_COLOURSPACE.RGB_to_XYZ_matrix)

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

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

应该转换为y'cbcr使用相同的权重?

y'cbcr有很多变体,如果您不知道需要哪种变体,没有人能够正确回答。

应该在线性或srgb空间中执行它吗?

y'CBCR转换几乎总是在伽马编码的值中发生,itu-r bt.2020 yccbccrc是一个显着的例外,因为它基于线性编码的值。同样重要的是要了解SRGB colourspace也是线性的,事实上,此处讨论的矩阵中心旨在应用于线性编码的SRGB值。

这两个问题可能应该在另一个新问题中提出。