Что под капотом у цифрового фото и видео: субдискретизация
Кодирование изображений имеет долгую и богатую историю, причём хронологически оно впервые появилось в телевидении. При переходе от чёрно-белого к цветному вещанию перед инженерами встала задача передачи значительно большего количества информации в пределах той же или почти той же полосы пропускания.
Отметим, что в те времена видеосигнал был аналоговым. Однако многие принципы его обработки были перенесены в «цифру» практически в неизменном виде. Изменился только способ промежуточного представления: вместо непрерывного аналогового сигнала изображение разбили на отдельные фрагменты — пиксели, которые стали описывать цифровым кодом.
Весь видимый спектр условно разделили на три базовых области — красный, зелёный и синий цвета, которые приблизительно соответствуют областям чувствительности рецепторов человеческого глаза. В устройстве вывода — кинескопе — использовали люминофоры трёх основных цветов, и таким образом обманули глаз, которому кажется, что он видит все возможные оттенки. За счёт того, что точки люминофора разных цветов располагались очень близко друг к другу, разрешения глаза было недостаточно для их разделения, и, например, все три светящихся на полную мощность точки воспринимались как одна точка белого цвета.
Затем на смену аналоговому видеосигналу пришло его цифровое представление. Все строки изображения разбили на одинаковые небольшие прямоугольники — пиксели. Следует заметить, что вначале пиксели не были квадратными, и лишь с развитием технологии оказалось удобным привести их к пропорции 1:1.
Таким образом, полное представление одного кадра — массив данных из m строк, каждая из которых состоит из n пикселей. Говорят, что кадр имеет размер n×m. В цифровой фотографии использовали тот же принцип, однако вместо последовательности кадров здесь есть только одно изображение.
Теперь разберемся, как кодируется кадр в наиболее распространенных форматах — JPEG для фото и MPEG для видео.
Весь кадр разбивается на блоки размером 4×2 пикселя. Внутри каждого блока производятся одинаковые операции.
Игнорируем случай, когда размер изображения не делится на 4 по горизонтали и на 2 по вертикали, поскольку это несущественно для изложения.
Вначале значение каждого пикселя преобразуется из цветового пространства RGB в YCbCr, где Y — яркостная составляющая, а Cb и Cr — хроматические. Рассмотрим этот процесс подробнее.
В RGB цвет каждого пикселя определяется тремя компонентами цветовых каналов — красного, зелёного и синего. Этого достаточно для однозначного описания, эти данные обычно имеются на входе, и они же используются для вывода на большинство дисплеев. Поэтому при декодировании изображения на выходе снова должно получиться цветовое пространство RGB. Зачем же нужна эта промежуточная конверсия?
В дело вступает психофизиология. Известно, что сетчатка глаза человека имеет большее количество палочек, ответственных за восприятие яркости, чем колбочек, воспринимающих оттенок. Поэтому яркостное разрешение глаза выше, чем цветовое. Это позволяет выкинуть часть данных из файла, в котором сохранено изображение, и таким образом уменьшить его размер. Как это сделать?
Разделим яркостную и хроматические составляющие. Яркость будем измерять по шкале от чёрного до белого, а оттенок — двумя компонентами, от янтарного до синего и от зелёного до пурпурного. Существует взаимно однозначное преобразование из одного цветового пространства в другое. Разумеется, в реальности будет некоторая погрешность, обусловленная ограниченной точностью машинного представления чисел, но на глаз она не заметна, поэтому мы ею пренебрегаем.
Слева — оригинальное изображение, справа — его представление в цветовом пространстве YCbCr.
Невооруженным глазом видно, что в яркостном канале гораздо больше информации, чем в хроматических. Воспользуемся этим и проведем субдискретизацию, то есть уменьшение разрешения хроматических составляющих. После восстановления изображения в цветовом пространстве RGB яркости пикселей останутся неизменными, а оттенки соседних пикселей будут усреднены, но мы этого не заметим.
Таким образом, если мы уменьшим линейное разрешение хроматических каналов, например, вдвое, для их хранения и передачи потребуется вчетверо меньше данных. Если предположить, что разрядность представления во всех каналах одинакова и равна исходной, размер файла составит
от исходного. Сэкономили половину безо всякой продвинутой компрессии, а на глаз ничего не поменялось.
Вернемся к пикселям и их базовой группе размером 4×2. Мы сохранили информацию о яркости каждого пикселя в каждой строке (по 4 штуки), а для оттенка оставили только по два значения в каждом канале на всю группу. Такая субдискретизация обозначается как 4:2:0 и очень широко используется при передаче видеосигналов.
Субдискретизация 4:2:0, каналы Cb и Cr.
Что за цифры в этом обозначении? Первая 4 показывает, сколько отсчётов яркости сохранено для каждой строки. Вторая 2 — в каналах Cb и Cr для первой строки, и третья 0 — для второй строки. Подразумевается, что усреднение оттенка велось по всем четырем пикселям — 2 из первой строки и 2 расположенных под ними из второй. Информация из второй строки (0) не проигнорирована, а усреднена с первой строкой.
У такого представления есть заметный недостаток. Особенно хорошо его видят люди с хорошим зрением. Цветовое разрешение оказывается слишком низким, особенно при пристальном разглядывании изображения. Чтобы исправить ситуацию, проводят менее «жёсткую» субдискретизацию, 4:2:2. Хроматические каналы усредняются не по 4, а по 2 пикселя.
Субдискретизация 4:2:2.
Видно, что цветовая детализация такого изображения заметно выше, однако для его сохранения требуется больше данных, а именно 2/3 от исходного объёма. Такая схема используется для более качественного сохранения картинки, и за это качество приходится платить размером файла или полосой пропускания при передаче данных по сети. Субъективно такое изображение имеет более чистые цвета.
Однако в некоторых приложениях и такой точности оказывается недостаточно. Например, в приложениях компьютерной графики усреднение оттенков может вызывать нежелательные артефакты при наложении изображений друг на друга, особенно когда один из цветов (обычно чистый зеленый, реже синий) используется в качестве «ключевого», то есть обозначает прозрачные участки кадра.
Субдискретизация 4:4:4.
При использовании субдискретизации 4:4:4 никакого выигрыша в объёме данных от преобразования в цветовое пространство YCbCr не происходит, поэтому такие изображения часто оставляют в RGB для устранения ошибок округления во время сначала прямого, а затем и обратного преобразования. Поэтому такой режим используется сравнительно редко и только в случае крайней необходимости.
Существуют и другие экзотические форматы субдискретизации, например, 4:2:1, 4:1:1 и 4:1:0. Их использование крайне ограничено из-за значительных, хорошо видимых на глаз искажений цветов. Их можно найти в устаревших форматах видеозаписи на магнитную ленту.
Особняком стоит субдискретизация 3:1:1, использовавшаяся в формате видеозаписи высокой чёткости Sony HDCAM, применявшемся в компактных видеокамерах. О его особенностях предлагаю вам поразмышлять самостоятельно.
В приложениях записи и трансляции видеосигнала формат субдискретизации обычно указывается как самостоятельный параметр, и его можно настраивать непосредственно. С фотографией всё немного сложнее. Многие популярные программы обработки неподвижных изображений не показывают пользователю, какая субдискретизация используется при сохранении файла, а принимают решение об этом самостоятельно. Например, Adobe Photoshop при сохранении в JPEG ухудшает субдискретизацию при переходе от качества 51% к 50%, что приводит к скачкообразному уменьшению размера файла ценой значительной потери визуального качества.
Наконец, стоит упомянуть о режиме субдискретизации 4:4:4:4. Он используется в изображениях с альфа-каналом, несущим информацию о степени непрозрачности каждого пикселя, и применяется в основном в приложениях компьютерной графики. Четвёртая цифра 4 здесь обозначает количество отсчетов альфа-канала в каждой строке блока 4×2. В этом случае обычно не производится конверсия в цветовое пространство YCbCr, и пиксели кодируются в формате RGBA.
Какую субдискретизацию выбрать? Ответ на этот вопрос зависит от ваших целей и ограничений.
Если вы создаёте оригинальное изображение или видео, то для архивных целей, разумеется, стоит использовать 4:4:4 (или 4:4:4:4). Файлы будут занимать много места, но зато вы не потеряете техническое качество.
Большинство современных видеокамер не умеют записывать формат 4:4:4. Поэтому при наличии возможности для съемки желательно применять 4:2:2.
Если вы передаете изображение или видео по сети, на первый план выходят соображения экономии данных, и для просмотра наиболее сбалансированным можно считать 4:2:0.
Более «суровую» субдискретизацию лучше не использовать. С эстетической точки зрения обычно лучше уменьшить общее разрешение изображения, чем применять 4:1:1 или 4:1:0, даже если у вас есть такая техническая возможность.
Однако при работе с уже существующим материалом не имеет смысла для сохранения результата использовать субдискретизацию более высокого разрешения, чем у оригинала. Например, сохранив обработанное видео с исходником 4:2:0 в 4:4:4, вы не получите никакого преимущества, поскольку информация о цвете уже была потеряна, но файлы заметно увеличатся. Исключение здесь только одно: при значительном уменьшении общего разрешения кадра путем масштабирования усреднение оттенков в некоторой степени «исправляется».
***
Это был обзор первой стадии подготовки изображений к сохранению в файл или передаче по сети. В большинстве случаев после субдискретизации проводится вторая стадия — компрессия, которая обычно сопровождается дальнейшими более или менее заметными потерями качества. Но это — тема для отдельной статьи.