Окончательное преобразование не удаляет яркость, оно создает два новых значения: x , y , которые вместе определяют цветность, а Y содержит яркость.Это ключевой абзац в вашей ссылке на инструкцию (непосредственно перед ссылками на формулы):
Цветовое пространство CIE XYZ было специально разработано так, чтобы параметр Y был меройяркость или яркость цвета.Цветность цвета затем определялась двумя производными параметрами x и y, двумя из трех нормализованных значений, которые являются функциями всех трех трехстимульных значений X, Y и Z:
Что это означаетявляется то, что если у вас есть изображение поверхности, которая имеет один цвет, но часть поверхности находится в тени, то в пространстве xyY значения x и y должны быть одинаковыми (или очень похожими) для всех пикселей нана поверхности независимо от того, находятся они в тени или нет.
Значения xyz, полученные при окончательном преобразовании, нельзя преобразовать непосредственно обратно в RGB, как если бы они были значениями XYZ (обратите внимание на заглавные буквы).Итак, чтобы ответить на ваш реальный вопрос: если вы используете значения xyz, как если бы они были значениями XYZ, в вашем коде нет ошибок.Перевод в RGB с этого не должен работать, используя формулы, которые вы связали.
Теперь, если вы действительно хотите удалить тени со всего изображения, вы должны:
- масштабировать значения RGB до значений с плавающей запятой в диапазоне [0-1]путем деления каждого значения на 255 (при условии 24-битного RGB).Преобразование в плавающую точку очень помогает точности!
- Преобразовать изображение в xyY
- Заменить все значения Y одним значением, скажем, 0,5, но экспериментировать.
- Обратное преобразование из xyY в XYZ:
- Затем измените значения RGB на интервале [0..255].
Это должно дать вам оченьскучная, но бестеневая версия вашего исходного изображения.Конечно, если ваша цель заключается в обнаружении областей одного цвета, вы также можете просто сделать это для значений xy на изображении xyY и использовать области, обнаруженные там на оригинале.