От переводчика
Работая над багом под названием "разная цветокоррекция у видео и его скриншота" я наткнулся на интересный текст, простыми словами описывающий то, что происходит с цветом в PNG. Ниже представлен перевод приложения к спецификации PNG, которое может и устарело, но всё равно полезно для общего развития.
О цветности
В PNG блок cHRM используется вместе с блоком gAMA для передачи точной цветовой информации, чтобы PNG-изображение могло быть отображено на экране или напечатано с большей цветовой точностью, чем это возможно без данной дополнительной информации. Это руководство кратко описывает теорию цвета для тех, кто с ней еще не знаком.
Стоит заметить, что показ изображения с некорректной гаммой приведет к гораздо большим цветовым ошибкам чем проблемы с использованием данных о цветности. Сначала надо проверить настройки монитора, затем убедиться в правильности гамма-коррекции, а только потом уже беспокоиться о цветности.
Проблема цвета
Цвет объекта зависит не только от точного спектра света, излучаемого объектом или отраженного им, но также от наблюдателей - их биологии, того, что они еще видят в то же время и даже от того, на что они только что смотрели. Более того, два значительно отличающихся спектра могут создавать одинаковое цветовое ощущение. Цвет - это не объективное свойство объектов реального мира; это субъективное, биологическое ощущение. Однако, делая пару упрощающих дело предоположений (например, рассматривая только человеческое зрение), становится возможным создать математичекую модель цвета и за счет этого получить хорошую цветовую точность.
Приборозависимый цвет
При просмотре одних и тех же RGB-цветов на трех разных мониторах, стоящих рядом, вы получите заметно отличающийся цветовой баланс на каждом дисплее. Это происходит из-за того, что каждый монитор излучает RGB-цвета немного разных оттенков и интенсивности. RGB - это пример приборозависимой цветовой модели: цвет, который вы получите, зависит от устройства. Отсюда следует, что конкретное значение, например, RGB 87/146/116
на одном мониторе может кодироваться как RGB 98/123/104
на другом, чтобы воспроизвести один и тот же цвет.
Приборонезависимый цвет
Полное физическое описание цветового мира потребует спецификации точного спектрального распределения мощности источника света. К счастью, человеческий глаз и мозг не так чувствительны, чтобы требовать точного воспроизведения спектра. Существуют математические приборонезависимые модели цвета, которые описывают достаточно хорошо то, как конкретный цвет ощущается людьми. Наиболее важной приборонезависимой цветовой моделью, к которой могут быть сведены все остальные, является модель XYZ, созданная Международной Коммиссией по Освещению (CIE).
В модели XYZ, X - это сумма взвешенного распределения мощности цвета по всему видимому спектру. Аналогично, Y и Z - такие же суммы, но с другими весами. Таким образом, произвольное спектральное распределение мощности сжимается до трех чисел с плавающей точкой. Веса были выбраны путем экспериментов на людях (эксперименты по сопоставлению цветов, проводились в 1920-х годах). XYZ стал международным стандартом в 1931 г., и у него есть некоторые полезные свойства:
два одинаковых значения XYZ выглядят одинаково для людей
два разных значения XYZ выглядят по-разному
Y-компонента представляет собой информацию о яркости (освещенности)
Цвет любого объекта может быть объективным образом измерен и закодирован в значение XYZ
Цветовые модели, основанные на XYZ, уже много лет используются людьми, которым нужен полный контроль над цветом - светотехниками для фильмов и телевидения, художниками и производителями красок и т.д. Точное приборонезависимое представление цвета стало широко распространяться из специализированных High-End областей в массы в конце 1980-х, и формат PNG заметил данный тренд.
Калиброванный приборозависимый цвет
Традиционно, форматы изображений использовали некалиброванные, приборозависимые значения цвета. Если точные параметры исходного устройства получения изображения известны, становится возможным преобразовать приборозависимые цвета конкретного изображения в приборонезависимую форму. Сильно упростив (например, сократив спектр рассматриваемых устройств до ЭЛТ-мониторов, которые гораздо проще, чем принтеры), всё что нужно - это знать XYZ значения базовых цветов монитора, а также CRT-экспоненту.
Так почему PNG не хранит изображения в XYZ вместо RGB? На то есть две причины. Во-первых, хранение изображения в XYZ потребует больше битов точности, что сделает средний размер файла больше. Во-вторых, любым программам требуется конвертировать данные изображения перед просмотром. Независимо от того, калиброван дисплей или нет, любые варианты RGB-представлений даже без цветовой коррекции дают достаточно близкое к реальности цветовое представление (для нетребовательных пользователей). Храня калиброванный RGB, PNG сохраняет совместимость с существующими программами, ожидающими RGB-анные, а также предоставляет достаточно информации для преобразования в XYZ в приложениях, которые требуеют более точных цветов. За счет этого формат получает преимущества обоих миров.
Цветность и яркость
Цветность - это объективное измерение цвета объекта, не затрагивающее информацию о яркости. Цветность использует два параметра x и y, которые легко вычисляются из XYZ-модели:
x = X / (X+Y+Z)
y = Y / (X+Y+Z)
XYZ цвета с одинаковой цветностью будут иметь один и тот же оттенок, но отличаться абсолютным значением яркости. Можно заметить, что x и y являются безразмерными величинами, так что сохраняют свое значение независимо от того, какие единицы измерения используются для X/Y/Z.
Y-компонента цвета в XYZ прямо пропорциональна его абсолютной яркости (brightness) и называется яркостью (luminance). Мы можем описать цвет либо по координатам XYZ, либо по цветности x,y и яркости Y. Преимуществом XYZ-представления является то, что оно линейно зависит от интенсивности RGB-компонент.
Описываем характеристики мониторов
"Точка белого" для монитора - это значение цветности x,y для номинально белого цвета, отображаемого монитором, т.е. цвета, который отображается когда R=G=B=max.
Обычно для спецификации цветов монитора дают цветности отдельных люминофоров RGB, а также точку белого. Точка белого позволяет вывести относительную яркость всех трех люминофоров, которую нельзя получить только из их цветности.
Стоит заметить, что абсолютная яркость монитора не специфицируется. При работе с компьютерной графикой, мы обычно не обращаем много внимания на абсолютные значения яркости. Вместо того, чтобы работать с абсолютными значениями XYZ (в которых XYZ выражаются в физических единицах излученной мощности, таких как кандел на кв.м.), довольно удобно работать в "относительных единицах XYZ", где номинальный белый на мониторе достигается при светимости равной 1.0. При таком предположении, можно очень просто вычислить XYZ-координаты белого, красного, зеленого и синего цветов монитора из их значений цветности.
Почему же блок cHRM (блок данных, отвечающий за коррекцию цветности) использует значения x,y вместо XYZ? Просто потому, что в таком виде предоставляют информацию производители устройств в своих спецификациях. Обычно, первая вещь, которую делает программа, это конвертация цветностей из блока cHRM в относительное пространство XYZ.
Использование модели XYZ
Если в PNG-файле есть блоки gAMA (гамма-коррекции) и cHRM, исходные RGB-значения могут быть сконвертированы в XYZ. Это позволяет:
делать точное преобразование в оттенки серого (просто используя Y-компоненту)
конвертировать в RGB-цвета текущего монитора (чтобы увидеть оригинальные цвета)
печатать изображение с помощью языка печати Level 2 PostScript с большей точностью, чем может предоставить обычное преобразование RGB в CMYK
вычислять оптимальную цветовую палитру
передавать данные изображения подсистеме управления цветом
и т.д.
Преобразование между RGB и XYZ
Сначала сделаем несколько упрощений: например, монитор реально черный, когда нет сигнала, а лучи цветовых компонент не интерферируют друг с другом. Потом, зная XYZ-значения RGB-цветов конкретного монитора, можно сформировать матрицу преобразований:
Xr Xg Xb
M = Yr Yg Yb
Zr Zg Zb
Значения RGB в диапазоне от 0 до 1 могут быть переведены в XYZ с помощью умножения на матрицу (если у вас есть значения, закодированные с учетом гаммы, нужно сначала убрать гамма-преобразование).
X R
Y = M * G
Z B
Можно производить то же преобразование и в обратную сторону - умножая на матрицу, обратную к M.
Охват устройства
Gamut (далее охват) устройства - это подмножество видимых цветов, которые это устройство в состоянии отобразить. (И он не имеет ничего общего с гаммой). Охват RGB-устройства может быть представлен как многогранник в XYZ-пространстве: вершины соответствуют точкам черного, RGB, CMY и белого цветов на устройстве.
У разных устройств разные охваты, другими словами одно устройство может отображать определенные цвета (обычно очень насыщенные), а другое - нет. Охват конкретного RGB-устройства может быть определен из его RGB цветностией и белой точки (те же значения представлены в блоке cHRM). Охват цветного принтера более сложен и может быть определен только путем измерений. Однако, охват принтера обычно меньше охвата монитора, что означает существование большого количества цветов, которые могут быть отображены только на мониторе (т.е. не могут быть физически напечатаны).
Преобразование данных изображения с одного устройства к другому обычно приводит к ошибкам охвата - цветам, которые не могут быть точно отображены конечным устройством. Процесс подстройки цветов, от обычной обрезки до нелинейных масштабирующих преобразований, называется gamut mapping (отображение охвата). Целью этого отображения является праводподобное визуальное представление оригинального изображения.