【问题标题】:Convert from linear RGB to XYZ从线性 RGB 转换为 XYZ
【发布时间】:2018-02-18 07:59:55
【问题描述】:

这个矩阵应该从 linear 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 空间中执行?

【问题讨论】:

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


    【解决方案1】:

    此矩阵从 sRGB flavour 转换为 CIE XYZ D65。然而,这不是 IEC 61966-2-1:1999 中发布的官方 sRGB 矩阵,它被四舍五入如下:

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

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

    这里是一个用Colour计算的双精度转换矩阵供参考:

    [[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 色彩空间也是线性的也很重要,事实上,这里讨论的中心矩阵适用于线性编码的 sRGB 值。

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

    【讨论】:

    • 好的,所以这里的所有内容都应该使用 sRGB 值作为输入,而不是像在 CG 上下文中使用的线性亮度值?
    • 当您应用转换时,这取决于您在链中的位置,但 CIE XYZ 到 RGB 和 RGB 到 CIE XYZ 转换预计会发生在线性光值上。
    • 我觉得奇怪的是 Y' 的推荐权重(经过伽马校正)与 XYZ 矩阵中的第二行相同(应该适用于线性值)。跨度>
    • 这句话很贴切,下面是一些相关信息:poynton.ca/PDFs/Transforms_among_luma_coeff.pdf
    猜你喜欢
    • 1970-01-01
    • 2020-03-16
    • 1970-01-01
    • 2020-08-09
    • 2010-12-01
    • 1970-01-01
    • 2020-03-17
    • 2016-01-11
    • 1970-01-01
    相关资源
    最近更新 更多