Вот фотография новогодней ёлки в том виде, в котором видит матрица камеры:

Данные матрицы с 14-битными значениями АЦП, преобразованными в значения 0-255 RGB.
Данные матрицы с 14-битными значениями АЦП, преобразованными в значения 0-255 RGB.

Она даже не чёрно-белая, а серо-серая.

Причина этого в том, что хотя аналогово-цифровой преобразователь (АЦП) камеры теоретически способен выдавать значения от 0 до 16382, данные не покрывают весь этот диапазон:

Гистограмма сырого изображения
Гистограмма сырого изображения

Реальный диапазон значений АЦП приблизительно равен от 2110 до 13600. Давайте представим эти значения в изображении в виде чёрного и белого:

Vnew = (Vold - Black)/(White - Black)

Прогресс
Прогресс

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

В цветной камере на матрицу наложена сетка перемежающихся цветовых фильтров:

Давайте раскрасим каждый пиксель в цвет того фильтра, через который он виден:

Наложение фильтра Байера
Наложение фильтра Байера

Эта версия более цветная, но каждый пиксель имеет лишь одну треть от своего RGB-цвета.

Чтобы исправить это, я просто усреднил значения каждого пикселя с его соседями:

Устраняем эффект мозаики
Устраняем эффект мозаики

Если применить этот процесс ко всему фото, свет получит цвет:

Дерево без мозаики
Дерево без мозаики

Однако изображение по-прежнему слишком тёмное. Мониторы не обладают таким же динамическим диапазоном, что и человеческий глаз или матрица камеры: даже если у вас OLED-дисплей, от экрана всё равно будет отражаться внешнее освещение, ограничивая максимальную степень его черноты.

Есть и ещё одна менее очевидная причина этого:

Истинный линейный градиент
Истинный линейный градиент

Наше восприятие яркости нелинейно.

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

Градиент sRGB
Градиент sRGB

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

Обе эти проблемы можно решить, применив к каждому цветовому каналу нелинейную кривую, чтобы сделать тёмные области более яркими… но в итоге получается не очень:

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

Как бы то ни было, это можно решить при помощи баланса белого: можно выровнять каналы, умножив каждый из них на константу.

Однако поскольку изображение нелинейно, для этого мне придётся сделать шаг назад. Вот показанное выше тёмное изображение со временным масштабированием всех значений, чтобы можно было увидеть проблему:

… а вот изображение с ослабленным зелёным, чтобы он соответствовал остальным каналам:

… и снова применяем кривую:

Наконец-то мы получили неплохое фото.

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

Кроме того, применение кривой к каждому цветовому каналу непроизвольно привело к снижению насыщенности ярких участков. Этот эффект выглядит вполне неплохо (и именно его мы привыкли ожидать от плёнки), но из-за него звезда стала менее жёлтой. Можно выделить светлоту и применить к ней кривую, сохранив при этом цвет. Само по себе это превратило бы светодиодную гирлянду в перенасыщенный хаос, но если объединить оба способа, то можно получить красивые результаты.

Вот для сравнения фотография, которую сгенерировала моя камера из тех же данных:

Изображение JPEG «из камеры»
Изображение JPEG «из камеры»

Фотография явно далеко «не оригинальная»: чтобы достаточно точно отразить, как объект выглядит на самом деле, нужен приличный объём вычислений.

Все изменения контрастности или баланса белого, вносимые вами в графическом редакторе, выполняет «за кулисами» и сама камера. Отредактированное фото не становится «фальшивей», чем оригинал, это просто разные визуальные представления одних и тех же данных.

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