В этой статье рассматривается технология преобразования значений RGB из цветового пространства камеры (получаемые после интерполяции изображения), в целевое или выходное пространство, например, sRGB. B прежде чем приступить к обсуждению, напомню некоторые необходимые нам понятия:

Цветовая модель - это система, описывающая цвет, используя некоторые координаты. Среди широко используемых можно назвать RGB, CMYK, HSV, Lab, XYZ. Не нужно путать цветовую модель и цветовое пространство. sRGB - это цветовое пространство, использующее модель RGB. Среди цветовых пространств можно выделить AdobeRGB и ProPhoto RGB, как наиболее часто используемые фотографами. Цветовое пространство характеризуется прежде всего своим охватом, т.е. все возможные значения цвета в цветовом пространстве формируют некоторое тело (гамут) в цветовой координатной системе. Любые значения за пределами охвата этого тела называют внегамутными. Внегамутные цвета при перцептивном преобразовании обрезаются и в этом кроется главная опасность преобразований из одного пространства в другое. Трансформации из одного пространства в другое возможны напрямую (если это возможно), но чаще преобразование производится через промежуточное пространство XYZ или Lab, которое называют пространством соединения профилей (Profile Connection Space). Если Вам что-либо из этого абзаца незнакомо или непонятно, настоятельно рекомендую прямо сейчас начать ликвидировать пробелы (Википедия и море-океан Интернет-источников в помощь).

После интерполяции и масштабирования (шкалинг) из RAW получается набор RGB значений в цветовом пространстве камеры. Это не sRGB и никакое другое известное пространство, это пространство, присущее конкретной связке камера-объектив-фильтры. То есть речь даже не о модели какого-то бренда, а о конкретном экземпляре. Пространства разных экземпляров могут различаться весьма заметно. Соответственно, возникает потребность в определении этого пространства, чтобы выполнять преобразования из камерного RGB в какое-либо известное пространство. Для целей этой статьи будет использоваться в качестве целевого пространство sRGB.

С учетом того, что после покупки владелец камеры может сразу без всяких калибровок снимать в sRGB (в формат jpeg), становится очевидным, что информацию о пространстве камеры производитель внедрил в программное обеспечение камеры. То есть эта информация известна (как минимум производителю). Проблема в том, что производители этой информацией не делятся ни с кем. По этой причине производители сторонних конвертеров вынуждены создавать свои профили для камер (профили преобразуют из камерного RGB в пространство XYZ). Но эти профили создаются с помощью конкретного экземпляра камеры. И по этой причине такие профили могут выдавать весьма плачевные результаты на других экземплярах той же модели. Мы не будем в этой статье рассматривать работу профилей и сконцентрируем внимание на матричном преобразовании. Хочу лишь заметить, что в камерах производители используют "универсальные" матрицы для моделей, которые создаются по принципу "средняя температура по больнице", поэтому разные камеры одной модели также могут выдавать разные изображения одного и того-же. Кроме того, матрицы рассчитываются для конкретного источника света с конкретной цветовой температурой, это либо D50, либо D55, либо D65. Если снимок сделан в условиях, далеких от этих температур, то и цветовоспроизведение будет соответствующим (чем дальше, тем хуже).

На данном этапе мы уже знаем, что имеется некоторая информация для преобразования из камерного RGB в целевое и эта информация хранится в небольшой матрице 3 на 3. Как ни странно, такой матрицы вполне хватает, чтобы корректно преобразовывать из камерного RGB в целевое. Матрицы такие создаются специальным программным обеспечением, используя снимок со снятой цветовой мишенью. Если Вы знакомы с процессом создания профилей, то здесь точно такой же подход. На выходе получается матрица, преобразующая либо сразу в sRGB (или AdobeRGB), либо в XYZ. То есть процесс выглядит так:

sRGB = M * RGB

где sRGB - значения триады RGB в пространстве sRGB, M - цветовая матрица (матрица преобразования цвета), RGB - значения RGB в пространстве камеры. Для тех, кто прогуливал в школе уроки математики, представим это выражение в развернутом виде:

Триады sRGB и Camera RGB представляют собой также матрицы (векторы). Операция умножения матриц выполняется обычным образом:

Другими словами, производится сложение перемноженных пар элементов строк первой матрицы и колонок второй:

Обращаю внимание, что умножение матриц некоммутативно, т.е. A*B <> B*A (т.е. не равно), но ассоциативно, т.е. (A*B)*C = A*(B*C). Для преобразований необходимо придерживаться правила: AtoC = BtoC * AtoB;

Чтобы произвести обратное преобразование, например, из sRGB в Camera RGB, нужно матрицу инвертировать, т.е. получить обратную матрицу:

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

Получив RGB после интерполяции, например, через dcraw, мы можем преобразовать данные в любое пространство, осталось только раздобыть соответствующие матрицы. Поскольку производители своими фирменными матрицами не делятся, можно либо самому создать для своей камеры, либо позаимствовать где-нибудь. Как создать, мы рассматривать в этой статье не будем, а вот где раздобыть обсудим.

www.dxomark.com - сайт, на котором можно найти свою камеру, затем в разделе MEASUREMENTS открываем вкладку Color Response. И там можно найти матрицы (Color matrix) при CIE-D50 (дневной свет, 5003К) и при CIE-A (лампы накаливания, 2856К). Матрицы эти непосредственно преобразуют из камерного RGB в sRGB. Вот как выглядят матрицы для Canon EOS 5D Mark III.

То есть, если мы сняли RAW с балансом белого 5000 или 2850, мы можем смело перемножать полученный RGB на данные матрицы. А что делать, если баланс белого, например, 4000K? Нужно проинтерполировать эти матрицы и получить матрицу для баланса белого в 4000К:

1. Получаем волшебное число Z = (1 / T - 1 / 5003) / (1 / 2856 - 1 / 5003), где T - баланс белого искомой матрицы, т.е. 4000 для нашего случая, Z = 0.33.

2. Чтобы получить элемент искомой матрицы: m = Z * (mA - mD50) + mD50. Например, для элемента m33 получаем m33 = 0.33 * (2.09 - 1.75) + 1.75 = 1.86.

В результате получаем следующую матрицу для 4000K:

Наличие двух матриц обеспечивает достаточно точное вычисление искомой матрицы, соответственно, нет необходимости формировать список матриц для всех возможных значений баланса белого. Используя эту матрицу, мы можем легко получить значения sRGB выше описанным образом.

В продуктах Adobe, а также некоторых других, используются матрицы Adobe, которые довольно легко заполучить. Достаточно свой RAW-файл сконвертировать в формат DNG с помощью Adobe DNG Converter. Далее, с помощью ExifTool можно получить из exif следующую информацию (для Canon EOS 5D Mark III):

Calibration Illuminant 1 : Standard Light A
Calibration Illuminant 2 : D65
Color Matrix 1 : 0.7234 -0.1413 -0.06 -0.3631 1.115 0.285 -0.0382 0.1335 0.6437
Color Matrix 2 : 0.6722 -0.0635 -0.0963 -0.4287 1.246 0.2028 -0.0908 0.2162 0.5668
Camera Calibration 1 : 1.0138 0 0 0 1 0 0 0 0.9784
Camera Calibration 2 : 1.0138 0 0 0 1 0 0 0 0.9784
Analog Balance : 1 1 1

Информацию эту можно получить через команду:

exiftool.exe -CalibrationIlluminant1 -CalibrationIlluminant2 -ColorMatrix1 -ColorMatrix2 -CameraCalibration1 -CameraCalibration2 -AnalogBalance filename.dng

Внимание! Используйте только последнюю актуальную версию DNG Converter, поскольку информация меняется. Кроме того, при конвертации DNG Converter скрытно использует профили из каталога "c:\Users\Username\AppData\Roaming\Adobe\CameraRaw\CameraProfiles\", подхватывая первый попавшийся для данной камеры профиль. Если Вы создаете профили самостоятельно, то можете в результате получить вовсе не то, что ожидали. Вот, например, как выглядела та же самая информация для Canon EOS 5D Mark III в моем случае, когда подхватился профиль из указанного каталога:

Calibration Illuminant 1 : Standard Light A
Calibration Illuminant 2 : D65
Color Matrix 1 : 0.8689 -0.3995 0.0886 -0.3222 0.9142 0.4805 -0.0503 0.1306 0.6186
Color Matrix 2 : 0.6963 -0.0923 -0.0659 -0.4577 1.2254 0.2617 -0.129 0.2302 0.6166
Camera Calibration 1 : 1.0332 0 0 0 1 0 0 0 1
Camera Calibration 2 : 1.0332 0 0 0 1 0 0 0 1
Analog Balance : 1 1 1

Можно контролировать профиль из exif, чтобы избежать недоразумений:

exiftool.exe -CalibrationIlluminant1 -CalibrationIlluminant2 -ColorMatrix1 -ColorMatrix2 -CameraCalibration1 -CameraCalibration2 -AnalogBalance -ProfileName filename.dng

Эта команда добавит строку:

Profile Name : Adobe Standard

Есть другой способ (который можно автоматизировать и заполучить все матрицы в нужном виде), через dcpTool. DCP-профили хранятся в каталоге c:\ProgramData\Adobe\CameraRaw\CameraProfiles\Adobe Standard\. Далее нужно найти свою камеру и преобразовать dcp в xml формат через dcptool. Это избавит от необходимости контролировать как отработал dng converter.

DNG файл содержит два набора матриц: для CIE-D65 (дневной свет, соответствующий полуденному (прямому солнечному и немного рассеянному) в Западной/Северной Европе, 6504K) и для CIE-A (лампы накаливания, 2856К). Однако в DNG SDK используются более грубые значения: 6500 и 2850. Color Matrix преобразует из XYZD65 в несбалансированное камерное пространство. Forward Matrix преобразует из сбалансированного камерного пространства в XYZD65. Color Matrix 2 используются в dcraw и во всех наследуемых от dcraw конвертерах.

Рассмотрим по шагам на реальном примере, как происходит волшебство преобразования из камерного RGB в sRGB. Имеются:

1. RAW-значения RGB: 2906, 4309, 2271, 4288
2. Значения ББ WB RGGB Levels Daylight : 2024 1024 1024 1664 (Color Temp Daylight : 5200)
3. Вышеуказанные значения матриц

Шаг 1. Находим множители баланса белого (делим на знание зеленого канала):

r=1.98 (2024/1024), g=1, b=1.63 (1664/1024)

Шаг 2. Находим сбалансированное значение RGGB (умножаем на множители ББ):

R=5743.89, G1=4309, G2=4288, B=3690.38

Шаг 3. Получаем RGB в цветовом пространстве камеры усреднив значения зеленых каналов:

RGB(5743.89, 4298.50, 3690.38)

Шаг 4. Получаем коэффициент интерполяции температур:

Z = (1.0 / temp - 1.0 / CalibrationIlluminant2) / (1.0 / CalibrationIlluminant1 - 1.0 / CalibrationIlluminant2)

Z = (1 / 5200 - 1 / 6500) / (1 / 2850 - 1 / 6500) = 0.20

Шаг 5. Получаем интерполированные матрицы для Color Matrix и Camera Calibration (элемент искомой матрицы равен сумме элемента первой матрицы, умноженного на коэффициент интерполяции и элемента второй матрицы, умноженного на (1-коэффициент)):

Color Matrix 5200: 0.682194521, -0.078686986, -0.089214041, -0.415894521, 1.220428082, 0.21884589, -0.080532192, 0.200056507, 0.581811301

Camera Calibration 5200: 1.0138, 0, 0, 0, 1, 0, 0, 0, 0.9784

Шаг 6. Получаем матрицу преобразования из XYZ D65 в Camera RGB по формуле:

XYZD65_to_CamRGB = AnalogBalance * CameraCalibration * ColorMatrix

XYZD65_to_CamRGB: 0.691608805, -0.079772867, -0.090445195, -0.415894521, 1.220428082, 0.21884589, -0.078792696, 0.195735286, 0.569244177

Шаг 7. Чтобы получить матрицу преобразования из Camera RGB в sRGB, нужно матрицу преобразования из XYZ65 в sRGB умножить на инвертированную матрицу (см. обратная матрица) , полученную на шаге 6, т.е. CameraRGB_to_sRGB = XYZD65_to_sRGB * Invert(XYZD65_to_CamRGB):

XYZD65_to_sRGB: 3.240454836, -1.53713885, -0.498531547, -0.96926639, 1.876010929, 0.041556082, 0.05564342, -0.204025854, 1.057225162 (данные взяты с сайта Брюса Линдблума)

CamRGB_to_sRGB: 4.091723123, -1.018672518, 0.165969976, -0.507978905, 1.60411518, -0.62441075, 0.016409599, -0.49490598, 2.050117538

Шаг 8. Умножая полученную матрицу на значения RGB из пространства камеры, получим:

sRGB(19736, 1673, 5533)

Перед тем, как из 16-битного режима привести к традиционному 8-битному (разделить каждое значение на 255), необходимо еще применить гамму, которая осветлит изображение. При этом произойдет сдвиг цветового тона, и RAW-конвертер должен позаботиться о защите от такого сдвига.

Я уже упомянул, что в dcraw используется одна матрица Color Matrix для D65. В этом случае не приходится заниматься интерполяцией между матрицами и все вычисления сводятся к формуле:

sRGB = Invert(XYZD65_to_CamRGB * sRGB_to_XYZD65) * RGB

Что касается Forward Matrix, то это матрица второго способа (а их всего два) преобразования из камерного RGB в XYZ. Adobe рекомендует использовать именно Forward Matrix, поскольку этот способ позволяет управлять алгоритмом хроматической адаптацией и настройкой баланса белого (в SDK содержится довольно мало информации на этот счет и более конкретных пояснений на данный момент у меня нет). Преобразование выполняется по следующей формуле:

XYZD65_to_CamRGB = ForwardMatrix * Inverse( AnalogBalance * CameraCalibration )

где, ForwardMatrix и CameraCalibration интерполированы для нужной температуры баланса белого.

И пару слов о профилях и матрицах. Профили ICC и DCP применяется вместо встроенных Color Matrix. Конвертеры, как, например, Capture One имеют для всех поддерживаемых камер свои профили. При этом происходят те же операции, что и с обычными матрицами, плюсом могут также применяться тоновые кривые и прочие преобразования. Если Color Matrix встроена в RAW производителем (и некоторые щедро предоставляют такую возможность), можно указать конвертеру (не во всех) использовать встроенную в RAW матрицу. Например, в dcraw это делает ключ +M (при условии, что используется баланс белого камеры или DNG-формат).

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

 

 

 

Добавить комментарий


Защитный код
Обновить