Конвертировать Lab в XYZ
Мне нужно иметь возможность преобразовать цвет Lab в цвет XYZ. Я следовал объяснениям на этой странице, основываясь на рекомендациях, которые я нашел по чужому вопросу: http://www.brucelindbloom.com/index.html?Eqn_Lab_to_XYZ.html
Я следовал за этим, но мои значения X и Z далеко, но Y правильно (я проверил это с парой онлайн-конвертеров (которые не показывают, как они конвертируют это...)). Я некоторое время смотрел на сайт Lab to XYZ, сейчас пытаюсь найти ошибку в моей математике.
Цвет Lab, с которым я тестирую: Lab[41, 48, -19]
Значения XYZ, которые я получаю: XYZ[5676.0352, 0.1186, 4845.2021]
(веб-сайт сказал, что результаты должны быть в диапазоне [0, 1]
referenceX
, referenceY
а также referenceZ
мои эталонные значения белого цвета.
Вот мой код (Java):
// https://www.mathworks.com/help/images/ref/whitepoint.html
// a: 1.0985, 1, 0.3556
// c: 0.9807, 1, 1.1822
// e: 1,1, 1
// d50: 0.9642, 1, 0.8251
// d55: 0.9568, 1, 0.9214
// d65: 0.9504, 1, 1.0888
// icc: 0.9642, 1, 0.8249 (what we're using)
double referenceX = 0.9642;
double referenceY = 1;
double referenceZ = 0.8249;
double fy = (this.lightness + 16) / 116;
double fx = this.a / 500 + fy;
double fz = fy - this.b / 200;
//todo make these constants
double kappa = 216 / 24389.0;
double epsilon = 24389 / 27.0;
double fx3 = fx * fx * fx;
double fz3 = fz * fz * fz;
double xr = fx3 > epsilon ? fx3 : (116 * fx - 16) / kappa;
double yr = this.lightness > kappa * epsilon ? Math.pow((this.lightness + 16) / 116, 3) : this.lightness / kappa;
double zr = fz3 > epsilon ? fz3 : (116 * fz - 16) / kappa;
double X = xr * referenceX;
double Y = yr * referenceY;
double Z = zr * referenceZ;
Поэтому я думаю, что мой вопрос, конечно, что не так с моей математикой? Или кто-нибудь может найти другой сайт с возможностью сделать преобразование (я не могу найти ни одного)?
Благодарю. Если вам нужны какие-либо разъяснения или у вас есть вопросы, пожалуйста, задавайте.
1 ответ
Не уверен, что здесь что-то пошло не так (если кто-то знает, скажите, пожалуйста!), Но я закончил тем, что использовал преобразование Википедии ( https://en.wikipedia.org/wiki/Lab_color_space, см. Обратное преобразование). Я не знаю, почему я не видел это сначала.