Конвертировать из линейного RGB в XYZ

Эта матрица должна конвертировать из линейный От RGBA до XYZ, сохраняя альфа-канал таким, какой он есть:

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

Решение

Эта матрица конвертирует из sRGB аромат CIE XYZ D65. Это, однако, не официальная матрица sRGB, опубликованная в МЭК 61966-2-1: 1999 который округляется до 4 цифр следующим образом:

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

В зависимости от контекста, в котором вы выполняете конверсии, может быть важно использовать официальную МЭК 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.sRGB_COLOURSPACE.RGB_to_XYZ_matrix)
np.set_printoptions(formatter={'float': '{:0.15f}'.format})
colour.sRGB_COLOURSPACE.use_derived_transformation_matrices(True)
print(colour.sRGB_COLOURSPACE.RGB_to_XYZ_matrix)

Должны ли обсуждаемые веса на самом деле быть идентичными?

Для согласованности в ваших вычислениях вы можете использовать веса, соответствующие вашей матрице, или у вас возникнут проблемы при выполнении преобразований туда и обратно.

Если преобразование в Y’CbCr использовать те же веса?

У Y’CbCr есть много вариантов, и никто не сможет ответить правильно, если вы не знаете, какой вариант вам нужен.

Должно ли оно быть выполнено в линейном пространстве или пространстве sRGB?

Преобразования Y’CbCr почти всегда происходят в значениях, закодированных гамма-сигналом, причем заметное исключение МСЭ-R BT.2020 YcCbcCrc составляет, поскольку оно основано на значениях линейного кодирования. Также важно понимать, что цветовое пространство sRGB также линейно, поскольку матрица, лежащая в основе обсуждения, на самом деле предназначена для применения к линейно кодированным значениям sRGB.

Эти два последних вопроса, вероятно, следует задать в другом новом вопросе.

1

Другие решения

Других решений пока нет …