double arrow

Вектор движения и компенсация движения

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

Давайте вычтем из одного кадра другой кадр. Получившийся кадр назовем остаточным кадром (residual frame).

На этом кадре почти не будет изображения — ведь разницы между соседними кадрами почти не было: т. е. в цифровом виде этот остаточный кадр будет заполнен нулевыми значениями. Это очень хорошо, потому что такие данные легко поддаются компрессии. Например, вместо последовательности из 100 нулевых значений, можно передать последовательность из двух (0,100). Первое из чисел показывает, какое значение повторяется, а второе — количество повторяющихся значений.

Кадр 79
Кадр 80
Разность кадров 80 и 79 (контрастность увеличена втрое)

Использование простой попиксельной разности последовательных кадров позволяет получить выгоду при сжатии видеоряда, содержащего неподвижные объекты. Но что произойдет с этой разностью, если объект или фон сдвинется всего на несколько пикселей? В зависимости от текстуры этого объекта разность может увеличиться весьма значительно, причем неприятным для алгоритма сжатия образом (может содержать много резких переходов цветов, то есть высоких частот).

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

Поэтому все современные алгоритмы сжимают не просто попиксельную разность двух последовательных кадров, а разность текущего кадра и так называемого «скомпенсированного» кадра.

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

На рисунке 7 приведены два последовательных кадра из фильма, их попиксельная разность и попиксельная разность одного из них с соответствующим скомпенсированным кадром.

Кадр 79
Кадр 80
Разность кадров 80 и 79 (контрастность увеличена втрое)
Разность кадра 80 со скомпенсированным кадром 79 (контрастность увеличена втрое)

Рисунок 7 – Последовательные кадры, попиксельная разность кадров и разность с компенсированным кадром

Существует несколько способов компенсации движения. Один из них - алгоритм поиска векторов, на которые сдвинулись блоки текущего кадра по отношению к предыдущему. Для каждого блока в изображении мы находим блок близкий по некоторой метрике (например, по сумме квадратов разности пикселей) в предыдущем кадре в некоторой окрестности текущего положения блока. Если минимальное расстояние по выбранной метрике с блоками в предыдущем кадре больше выбранного порога - блок сжимается независимо.


Рисунок 8 - Схема работы алгоритма сопоставления блоков

Компенсация движения состоит из передачи информации об участке изображения, который движется, и информации о том, куда движется этот участок. Куда он движется — описывается вектором движения.

Таким образом, вместе с каждым блоком в поток теперь сохраняются координаты смещения максимально похожего блока в предыдущем I- или P-кадре, либо признак того, что данные сжаты независимо. Эти координаты задают вектор смещения блока (motion vector). В ситуациях, когда камера наезжает на объект или дает панораму, использование векторов смещений блоков позволяет значительно уменьшить амплитуду разности кадров, и как следствие - значительно поднять степень сжатия.

Рис. 3.11. Кодируемый и ключевой кадры

Состав Р-кадра

Вернемся к вычитанию одного кадра из другого. Давайте перед этим вычитанием мы выполним компенсацию движения, т. е. получим информацию о движущихся участках. При этом сами участки исключим из вычитания, посчитав, что на месте этих участков при вычитании будут нули. Собственно, зачем нам их вычитать, ведь всю информацию об этих участках мы уже имеем — зачем дублировать информацию? Чем меньше информации, тем нам лучше — в этом и суть компрессии. Таким образом, количество нулей в остаточном кадре увеличится — добавятся нули там, где мы выполнили компенсацию движения.

Таким образом, после всех ранее описанных манипуляций, мы будем иметь следующую информацию, которую для наглядности покажем графически (рис. 3.12).

Рис. 3.12. Состав Р-кадра

Ключевой кадр передается без изменений (или подвергается внутрикадровой компрессии), а вот остаточный кадр и информацию о движении подвергают дальнейшей компрессии.

Рассмотрим, как компрессируется остаточный кадр. После получения остаточного кадра, он разбивается на прямоугольные участки (8x8 точек, 16x16 точек и т. п.). К каждому такому участку применяется дискретно-косинусное преобразование или иначе Discrete Cosine Transform сокращенно — DCT.

Давайте рассмотрим некий произвольный участок остаточного кадра размером 8x8 точек (рис. 3.13). Каждая точка этого участка в цифровом виде представляет собой число. В общем случае, точки разных яркостей и цветов могут иметь любую комбинацию, поэтому и числа тоже могут иметь любую комбинацию, поскольку мы рассматриваем произвольное придуманное изображение.

Рис. 3.13. Блок изображения 8x8 точек

Так вот чем хорошо DCT — оно описывает любую произвольную комбинацию чисел при помощи упорядоченной комбинации чисел.

Рис. 3.14. Получение матрицы коэффициентов DCT

Итак, из иллюстрации мы видим (рис. 3.14), что в результате DCT получилась таблица 8x8 ячеек, при этом числа, имеющие наибольшее значение, размещены в левом верхнем углу таблицы. Каких бы яркостей и цветов не были точки на исходном изображении 8x8, расположение чисел после применения DCT всегда будет примерно таким, как показано. Таким образом, числа, имеющие наибольшее значение, всегда будут иметь тенденцию к "скучива- нию" в левом верхнем углу. Соответственно, к правому нижнему углу будут группироваться нулевые значения.

Теперь произведем квантизацию данных в таблице. В нашем примере произведено квантование с шагом 3. То есть 3 = 1, 6 = 2, 9 = 3 и т. д. В реальных алгоритмах уровни квантования могут быть любыми.

Теперь считаем данные из таблицы (как показано на рис. 3.15) и запишем последовательности повторяющихся чисел парами (N, M), где N — количество повторений, а M — повторяющееся число. Такой способ записи называется групповым кодированием (run-length encoding — RLE).

Рис. 3.15. Считывание коэффициентов DCT и их сокращенная запись

Получившаяся запись через пары (N, M) будет гораздо короче, чем запись исходного изображения в цифровом виде — т. е. мы продвинулись еще дальше в компрессии нашего изображения и имеем компрессированный остаточный кадр (residual frame).

В реальных алгоритмах компрессирование остаточного кадра выполняется сложнее, в частности, выбираются различные размеры ячеек, к которым применяется DCT, используются разные уровни квантования, разные "маршруты" считывания результатов DCT и т. п.

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

Упрощенно, идея такого кодирования достаточно понятна: предположим, что у нас есть последовательность групп чисел: 111, 110, 111, 112, 111, 110, 080, 011, 111, 126, 135 и т. д. Пусть в этой последовательности 111 встречается 400 раз, 110 — 200 раз и остальные варианты — по 1 разу. Обозначим группу 111 числом 1, как самую часто встречающуюся, 110 числом — 2 и т. п. И будем группы "зашифровывать" при передаче этими числами. Первые 10 "шифров" будут однозначными числами (0...9), следующие — двузначными и т. п.

Поскольку в реальности количество разных вариантов групп может доходить до сотен, то ясно, что такое кодирование приведет к снижению потока информации при передаче. Действительно — наиболее часто будут встречаться "шифры" самых часто встречающихся групп, и эти шифры как раз и будут самыми короткими (т. е. содержать меньшее количество чисел). Подобное встречается в обычном человеческом языке — самые употребительные слова, как правило, являются самыми короткими (я, небо, река и т. п.

Энтропийному кодированию может быть подвергнута любая цифровая информация — как компенсация движения, так и компрессированный остаточный кадр. Существует несколько алгоритмов энтропийного кодирования: кодирование Хаффмана, арифметическое кодирование и т. п.

Готовая компрессированная последовательность форматируется в виде элементарного потока MPEG.

Для примера, на рис. 3.16 приведена условная формула, по которой происходит сборка Р-кадра в декодере.

Рис. 3.16. Состав Р-кадра с указанием примененных алгоритмов.).

Теперь рассмотрим, что происходит в декодере. В декодер сначала приходит ключевой кадр, который декомпрессируется (если к нему применялась внут- рикадровая компрессия) и сохраняется в памяти декодера. Этот кадр будет необходим в дальнейшем, поскольку он используется для "предсказания" кадров GOP, которые идут за ним. После того как прошла вся GOP, ключевой кадр удаляется из памяти, уступая свое место ключевому кадру следующей GOP.

Рис. 3.17. Межкадровое и внутрикадровое кодирование

После ключевого кадра начинают один за другим поступать P-кадры, которые представляют собой информацию об отличиях этих кадров от ключевого кадра (рис. 3.17). Информация эта состоит из двух частей, как мы видели: из векторов движения и участков, которые они описывают, а также остаточного кадра, обработанного DCT. И то и другое подвергнуто энтропийному кодированию.

Получив Р-кадр, декодер производит энтропийное декодирование всей информации, затем применяет обратное дискретно-косинусное преобразование, получая остаточный кадр. Этот остаточный кадр складывается с ключевым кадром. После этого выполняется компенсация движения — т. е. из ключевого кадра "выдергиваются" участки, которые переместились и складываются с полученным суммарным кадром в местах, определяемых векторами движения. В результате получается готовый кадр (рис. 3.18).

Последовательность готовых кадров передается на устройство, демонстрирующее ее зрителю (например, устройство интерфейса HDMI).

Опорный кадр Опорный кадр + компенсация

движения

Рис. 3.18. Порядок декомпрессирования изображения


Понравилась статья? Добавь ее в закладку (CTRL+D) и не забудь поделиться с друзьями:  



Сейчас читают про: