Что под капотом у цифрового фото и видео: глубина цвета
Предыдущая статья: субдискретизация.
Как мы уже выяснили, для кодирования цветного изображения каждый пиксель описывается несколькими каналами — RGB в большинстве случаев для оригинальных данных, и часто что-нибудь другое, например, YCbCr в закодированном файле. Однако это в любом случае некие цифровые (в наше время) данные.
В большинстве случаев, по крайней мере на момент написания этой статьи, каждый канал готового к публикации изображения описывается одним байтом на отсчет. Этого вполне достаточно для нормального восприятия изображения человеческим глазом. Давайте убедимся в этом.
Изображение в формате PNG (для исключения потерь информации), цветовое пространство RGB.
Слева — 8 бит на канал, справа — 4 бита на канал.
Мониторы и глаза у всех разные, поэтому возможно несколько вариантов:
Левая часть картинки выглядит для вас естественно. На правой небо безнадежно испорчено, однако, обратите внимание, паруса и море почти не пострадали. Вероятнее всего, это справедливо для большинства читателей.
Вы видите явную «полосатость» неба в левой половине. Тут две возможности:
а) у вас профессиональный монитор и очень хорошее зрение, поздравляю!,
б) у вас дешевый монитор, матрица которого показывает только 6 бит вместо 8, и тогда небо испорчено, хотя и в меньшей степени, чем справа.
Кадр сделан на вполне приличный фотоаппарат в формате RAW с глубиной цвета 12 бит, с правильной экспозицией, поэтому вариант изначально дефектной картинки мы с негодованием отметаем.
Гистограммы показанной выше фотографии. Плавные области соответствуют левой половине изображения, тонкие пики — правой.
Почему же для парусов и моря оказалось достаточно всего 4 бит на канал? Ответ прост: именно в этих областях изображения очень много мелких деталей. Психофизиология восприятия устроена так, что мы не замечаем в этом случае незначительные искажения яркости и оттенка отдельных пикселей. На этом же принципе основан дизеринг — преднамеренное добавление шума для устранения «полосатости».
В большинстве случаев для показа на современных экранах используют глубину цвета 8 бит, и этого вполне достаточно для практических целей.
При печати дело обстоит аналогично. В цветовой модели CMYK, используемой в полиграфии, часто ограничиваются шкалой от 0 до 100 в каждом из каналов. При этом не каждая комбинация значений описывает уникальный цвет, условия просмотра с бумаги обычно хуже, чем с экрана (непредсказуемое и неравномерное освещение, дефекты носителя и печати), так что и здесь 8-битного RGB-исходника достаточно. То же и с дорогой качественной фотопечатью: наверное, технически можно создать изображение с большей глубиной цвета, но зритель этого не увидит.
Зачем же тогда вообще нужно больше 8 бит на канал?
Мы живем в мире с очень высокой контрастностью. Зрение позволяет различать детали и в тенях, и в наиболее светлых участках за счет аккомодации, то есть бессознательной регулировки интенсивности падающего на сетчатку светового потока. В ясный солнечный день мы можем рассматривать предметы на открытой местности и внутри строения с маленькими окнами без искусственного освещения, но только по очереди, не одновременно. Эта особенность кажется нам естественной, мы привыкли к ней с раннего детства, и поэтому обычно не замечаем.
Иначе обстоит дело при фото- и видеосъемке. Камера не знает, на какой участок изображения следует обратить внимание, и поэтому вынуждена фиксировать всю картину как есть. Если сохранять изображение, полученное с матрицы, с глубиной цвета 8 бит на канал, будет неизбежно потеряна детализация или в светах, или в тенях, а чаще сразу и там, и там. Именно так происходит при сохранении снимков в формате JPEG, и впоследствии никакая дополнительная обработка не позволяет «вытянуть» ранее потерянную информацию.
Если же при съемке задать пониженную контрастность, чтобы в динамический диапазон файла «влезли» и света, и тени, то картинка будет выглядеть блеклой и невыразительной. Потребуется дополнительная обработка, в результате которой середина диапазона яркостей будет растянута, а края сжаты.
Сверху вниз: градиент от черного до белого с глубиной цвета 8 бит, тот же градиент, «растянутый» посередине, и то же самое, но с глубиной цвета 4 бита.
Если у вас качественный монитор и хорошее зрение, вы увидите разницу между верхней и следующей полосой. Ниже я продублировал ту же ситуацию, но с уменьшенной глубиной цвета для наглядности иллюстрации принципа. Прошу прощения за некоторую математическую неточность, выразившуюся в смещении центра — на ход рассуждений она не влияет. (Фотошоп лучше знает, как должен выглядеть градиент.)
На итоговом результате это будет выглядеть как полосы в областях плавного изменения яркости, или, выражаясь профессиональным языком фотографов, бандинг.
С цветными изображениями все еще хуже, поскольку к яркостным полосам добавится еще и заметное искажение оттенков, которое очень трудно исправить. Тот же эффект будет наблюдаться в большей или меньшей степени при любых операциях с цветом.
Для борьбы с этим дефектом исходный материал сохраняют с большей глубиной цвета — 10, 12 и даже 14 бит, в зависимости от технических возможностей оборудования. Обычно это формат RAW для фото и MPEG 10 бит 4:2:2 для видео, хотя видеокамеры среднего и высокого уровня тоже умеют сохранять RAW. Тогда при сохранении готового изображения в 8-битном представлении после обработки градиенты остаются визуально плавными. Важно всю обработку проводить при глубине цвета не меньшей, чем у оригинала, и загрублять данные только при финальном сохранении.
Другое применение большей глубины цвета — HDR, технология, позволяющая сохранить детализацию на небольших по площади участках кадра с очень высокой яркостью. Например, если в кадр попадает Солнце, оно не размазывается в невыразительную кляксу, а остается на изображении точечным источником небольшим кругом, вблизи которого небо имеет более или менее естественный вид. У этой технологии есть несколько разновидностей, но общий принцип одинаков: младшие биты яркостной составляющей используются для описания «нормальной» яркости, которую без проблем воспринимает глаз, а старшие подключаются для очень ярких участков, которые не могут быть слишком большими из-за технологических ограничений (например, слишком высокого потребления энергии и перегрева).
HDR используется не только для отображения на «продвинутых» мониторах и телевизорах, но и в приложениях компьютерной графики для текстур, над которыми при рендеринге сцены совершаются дополнительные операции, и важно не потерять точность, когда результат нормально помещается в 8 бит.
Наконец, большая глубина цвета (обычно до 16 бит) применяется в научных приложениях, где точность важна сама по себе, безотносительно возможностей восприятия глазом.
И на закуску упомяну ныне экзотический формат, 16 бит на три канала (RGB). Каждый канал получает по 5 бит, что почти эквивалентно правой половине показанной в самом начале фотографии, а оставшийся бит используется как альфа-канал или отдается зеленому, поскольку к нему человеческий глаз наиболее чувствителен. Такая схема широко применялась в системах с недостаточным количеством видеопамяти, и в последние годы встречается редко.