Вектор движения и компенсация движения
Простейший способ учитывать подобие соседних кадров - это вычитать каждый блок сжимаемого кадра из соответствующего блока предыдущего.
Давайте вычтем из одного кадра другой кадр. Получившийся кадр назовемостаточным кадром (residual frame).
На этом кадре почти не будет изображения — ведь разницы между соседними кадрами почти не было: т. е. в цифровом виде этот остаточный кадр будет заполнен нулевыми значениями. Это очень хорошо, потому что такие данные легко поддаются компрессии. Например, вместо последовательности из 100 нулевых значений, можно передать последовательность из двух (0,100). Первое из чисел показывает, какое значение повторяется, а второе — количество повторяющихся значений.
Кадр 79 | |
Кадр 80 | |
Разность кадров 80 и 79 (контрастность увеличена втрое) |
Использование простой попиксельной разности последовательных кадров позволяет получить выгоду при сжатии видеоряда, содержащего неподвижные объекты. Но что произойдет с этой разностью, если объект или фон сдвинется всего на несколько пикселей? В зависимости от текстуры этого объекта разность может увеличиться весьма значительно, причем неприятным для алгоритма сжатия образом (может содержать много резких переходов цветов, то есть высоких частот).
Компенсация движения — это последовательность действий, которая позволяет описать перемещающиеся участки изображений в двух последовательных кадрах.
Поэтому все современные алгоритмы сжимают не просто попиксельную разность двух последовательных кадров, а разность текущего кадра и так называемого «скомпенсированного» кадра.
Скомпенсированный кадр - это один из соседних (уже обработанных алгоритмом, то есть сжатых) кадров, в котором часть объектов (в идеале - все) перемещены и/или трансформированы так, чтобы этот измененный кадр был как можно более близок в некоторой метрике к текущему кодируемому кадру, разность с которым и будет непосредственно сжиматься. То есть скомпенсированный кадр можно получить, зная сам соседний кадр (обычно предыдущий) и некоторую дополнительную метаинформацию, которая называется информацией о движении.
На рисунке 7 приведены два последовательных кадра из фильма, их попиксельная разность и попиксельная разность одного из них с соответствующим скомпенсированным кадром.
Кадр 79 | |
Кадр 80 | |
Разность кадров 80 и 79 (контрастность увеличена втрое) | |
Разность кадра 80 со скомпенсированным кадром 79 (контрастность увеличена втрое) |
Рисунок 7 – Последовательные кадры, попиксельная разность кадров и разность с компенсированным кадром
Существует несколько способов компенсации движения. Один из них - алгоритм поиска векторов, на которые сдвинулись блоки текущего кадра по отношению к предыдущему. Для каждого блока в изображении мы находим блок близкий по некоторой метрике (например, по сумме квадратов разности пикселей) в предыдущем кадре в некоторой окрестности текущего положения блока. Если минимальное расстояние по выбранной метрике с блоками в предыдущем кадре больше выбранного порога - блок сжимается независимо.
Рисунок 8 - Схема работы алгоритма сопоставления блоков
Компенсация движения состоит из передачи информации об участке изображения, который движется, и информации о том, куда движется этот участок. Куда он движется — описывается вектором движения.
Таким образом, вместе с каждым блоком в поток теперь сохраняются координаты смещения максимально похожего блока в предыдущем I- или P-кадре, либо признак того, что данные сжаты независимо. Эти координаты задают вектор смещения блока (motion vector ). В ситуациях, когда камера наезжает на объект или дает панораму, использование векторов смещений блоков позволяет значительно уменьшить амплитуду разности кадров, и как следствие - значительно поднять степень сжатия.
Рис. 3.11. Кодируемый и ключевой кадры
Дата добавления: 2015-10-19; просмотров: 2457;