Должен ли результат sRGB-> CIEXYZ-> сбросить яркость быть преобразованным обратно в sRGB? - PullRequest
5 голосов
/ 31 мая 2011

Я пишу удаление тени для моего детектора пони . После того, как я преобразовал изображение PNG из sRGB в CIE XYZ , я удаляю яркость согласно инструкциям :
image
image
image

When I try to convert the image back to sRGB for display, I get RGB values that fall outside the sRGB гамма (я получаю значения больше 255). Это нормально, или я должен продолжать искать ошибки? Примечание: преобразование в XYZ и обратно без изменений не дает сбоев.

Иллюстрация (вверху слева: оригинал , внизу слева: значение байта для красного и синего оттенков):
image
Для полноты: вверху справа: соотношения цветов, внизу справа: преобразовать в HSV и выровнять значение.

1 Ответ

1 голос
/ 01 июня 2011

Окончательное преобразование не удаляет яркость, оно создает два новых значения: 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:

X from xyY

Z from xyY

  • затем в RGB:

XYZ to RGB

  • Затем измените значения RGB на интервале [0..255].

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

...