Компенсация движенияКомпенсация движения (англ. Motion Compensation) — один из основных алгоритмов, применяемых при обработке и сжатии видеоданных. Алгоритм использует схожесть соседних кадров в видеопоследовательности и находит векторы движения отдельных частей изображения (обычно - блоков 16×16 и 8×8). Использование компенсации позволяет при сжатии многократно увеличить степень сжатия за счёт удаления избыточности в виде совпадающих частей кадров. Используется не только при сжатии, но и при фильтрации видео, изменении частоты кадров и т. д. Идея алгоритмаРешение проблемы сжатия стало первостепенной задачей начиная с самого появления цифрового видео.[источник не указан 1532 дня] Для оценки возьмем видеоряд со следующими параметрами:
В итоге на запись или передачу одной секунды такого видео без применения сжатия потребуется 14,8 мегабайта без учета звука и служебной информации. Для хранения полуторачасового фильма уже будет нужно 79 920 мегабайт (78 гигабайт). Практически в любом видео соседние кадры похожи, имеют общие объекты, которые, как правило, смещаются параллельно.[источник не указан 1532 дня] И совершенно естественно желание закодировать видео так, чтобы объекты не кодировались многократно, а просто описывались некоторые их смещения.[нейтральность?] Даже в этом примере если взять и запаковать архиватором 0-й кадр и все изображения межкадровой разности, получится заметный[насколько?] выигрыш при сжатии. Но этот выигрыш можно существенно увеличить. Пример работы алгоритмаВ связи с высокой вычислительной сложностью алгоритмов распознавания образов и недостаточной точности их работы применяют различные методы, позволяющие быстро находить векторы движения (естественно, не без потерь). 1. Загружается текущий кадр. 3. Производится обход блоков (каждый блок в данном случае обрабатывается отдельно). 5. Таким образом, после завершения поиска мы получаем набор векторов, указывающий «движение» блоков изображения между кадрами. Эти векторы могут быть естественным образом использованы для создания изображения скомпенсированного кадра, который лучше приближает кадр, для которого производилась компенсация движения. Проблемы реализацииПри написании алгоритма может возникнуть вопрос - «Как оценивать „похожесть“ фрагментов изображения?». Некоторые из вариантов:
Наиболее часто используется вычисление SAD.[источник не указан 1532 дня] Следующий вопрос: «Как искать нужный блок?»
Пример реализацииРеализация метода полного перебора на C++ void ME( BYTE* CurrentFrame, BYTE* PreviousFrame, int Width, int Height, MV* MotionVectors )
{
int BlocksPerHeight = (Height + 15) >> 4; //Число блоков по вертикали
int BlocksPerWidth = (Width + 15) >> 4; //Число блоков по горизонтали
int VerticalOffset, HorizontalOffset, TempOffset; //Смещения
int OffsetPerLine = Width + Border * 2; //Смещение на одну строку
int StartOffset = OffsetPerLine * Border + Border; //Начальное смещение
BYTE *CurrPtr, *PrevPtr; //Указатели на предыдущий и на следующий кадры
MV ProbMV; //Пробный вектор
long MinError, Error; //Значения погрешности
for (int i = 0; i < BlocksPerHeight; i++)
{
for (int j = 0; j < BlocksPerWidth; j++)
{
//Вычисляем смещения
VerticalOffset = (i << 4) * OffsetPerLine + StartOffset;
HorizontalOffset = (j << 4);
//Устанавливаем смещения на текущий блок
CurrPtr = CurrentFrame + VerticalOffset + HorizontalOffset;
PrevPtr = PreviousFrame + VerticalOffset + HorizontalOffset;
MinError = MAXLONG; //Считаем ошибку очень большой
for (int y = -MaxMotion; y < MaxMotion; y++ )
{
TempOffset = y * OffsetPerLine; //Экономим на умножениях
for (int x = -MaxMotion; x < MaxMotion; x++ )
{
//GetError - функция сравнения блоков, например, SAD
Error = GetError (CurrPtr, PrevPtr + TempOffset + x, OffsetPerLine);
//Новый кандидат :)
if (Error < MinError)
{
ProbMV.x = x;
ProbMV.y = y;
MinError = Error;
}
}
}
//Записываем полученный вектор :)
MotionVectors [i * BlocksPerWidth + j] = ProbMV;
}
}
}
В новом[когда?] стандарте MPEG-4 AVC/H.264 введены также неквадратные (прямоугольные) блоки, размер которых может дробиться до 4×4 пикселя. Таким образом удаётся весьма эффективно использовать похожесть соседних кадров, а благодаря более сложной форме блоков возрастает точность компенсации движения на границах движущихся объектов. Кроме компенсации движения, для дальнейшего уточнения изображения (или для вновь появляющихся областей, которых не было в прошлых кадрах) используется сжатие межкадровой информации и независимое сжатие блоков.[источник не указан 1532 дня] Помимо сжатия, компенсация движения активно используется[кем?] в фильтрации видео, в частности, в качественных вариантах фильтров: деинтерлейсинга (преобразования чересстрочной развёртки в прогрессивную), шумоподавления, изменения частоты кадров и других. См. такжеСсылки
|