1. 1
  2. 2
  3. 3
  4. 4
  5. 5

# теория · шаг 2 из 5

Деформированная опора и предсказание по полям

Коротко

Опору можно подготовить не только сдвигом: изменение масштаба или деформация задают отображение координат текущего изображения в прежнее. Декодер должен повторить выборку, интерполяцию и обработку границ до прибавления остатка. Для чересстрочного изображения важно также время полей: соседние строки объединённого кадра относятся к разным моментам. Предсказание и группировку строк для преобразования можно выбирать по кадру или по полям. Эти решения связаны с избыточностью и не сводятся к фильтру красивого показа.

Если строишь предсказание по дробной координате и сравниваешь движение двух полей, переходи к «Теперь сам».

Как думаешь, достаточно изменить размер картинки на экране

Опорный кадр имеет одну сетку, новый должен иметь другую. Если кодировщик сначала увеличит опору, а декодер прибавит остаток к старой сетке, получится ли правильный кадр? Остаток рассчитан к конкретному предсказанию, поэтому операция подготовки опоры должна совпасть у обеих сторон. Увеличение уже готового изображения для окна проигрывателя этой задачи не решает.

Сходная проблема возникает у полей: кадр выглядит как одна прямоугольная матрица, но его чётные и нечётные строки сняты в разные моменты. Одинаковый сдвиг для всех строк может хуже описывать движение, чем два согласованных предсказания. Нужно различать пространственное соседство в массиве и временное происхождение отсчётов.

На что это похоже

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

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

Механизм: отображение координат до поиска остатка

Для одномерной модели определим источник по формуле u=a·x+b, где x - позиция текущего отсчёта, u - координата в опоре. При a=1 меняется только сдвиг. При a≠1 меняется масштаб выборки. Направление указано явно: идём от текущей позиции к источнику, а не пытаемся разнести каждый старый пиксел по новым адресам.

Если u попало между целыми k и k+1, обозначим дробную часть q=u−k и вычислим P(x)=(1−q)·ref[k]+q·ref[k+1]. Это линейная интерполяция: веса складываются в 1, у ближнего соседа вес больше. В нашем опыте координату заранее ограничиваем диапазоном 0..n−1. За краем поэтому повторяется крайний отсчёт. Такое правило не является единственным возможным, но оно одинаково у обеих сторон.

В двумерном случае похожая модель использует u=a·x+b·y+c, v=d·x+e·y+f. Она задаёт масштаб, сдвиг, поворот и сдвиг строк относительно друг друга. Значение выбирают, например, билинейно по четырём соседям. Опциональное resampling опор в H.263 имеет собственный нормативный набор параметров и правил; эта простая координатная модель объясняет механизм, а не подменяет Annex P произвольным фильтром.

Правило

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

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

Разбор: масштаб и остаток в одной цепочке

Опора [0,10,20,30], текущая строка [6,11,14,21]. Зададим u=0,5x+0,5. Для x=0,1,2,3 источники равны 0,5;1;1,5;2. После интерполяции получаем [5,10,15,20]. Остаток текущая−предсказание равен [1,1,−1,1]. Декодер повторяет отображение и сложение, восстанавливая текущую строку.

Если вместо этого он возьмёт старые значения без resampling, то прибавит остаток к [0,10,20,30] и получит [1,11,19,31]. Разность возникла не из-за квантования. Для сохранения данных требовалось одинаковое предсказание до применения поправки.

warp_fields.py
def sample(row, x):
    x = max(0., min(x, len(row)-1.))
    lo = int(x)
    hi = min(lo+1, len(row)-1)
    return row[lo]*(hi-x)+row[hi]*(x-lo) if hi != lo else row[lo]


reference = [0, 10, 20, 30]
prediction = [sample(reference, 0.5*x+0.5) for x in range(4)]
current = [6, 11, 14, 21]
residual = [a-b for a,b in zip(current,prediction)]
print("warp:", prediction, "остаток:", residual)
print("восстановление:", [a+b for a,b in zip(prediction,residual)])
ref = [[0,10,0,0], [0,0,10,0], [0,10,0,0], [0,0,10,0]]
cur = [[0,0,10,0], [0,10,0,0], [0,0,10,0], [0,10,0,0]]
for vector in [-1, 0, 1]:
    prediction = [[sample(row,x+vector) for x in range(4)]
                  for row in ref]
    error = sum(abs(cur[y][x]-prediction[y][x])
                for y in range(4) for x in range(4))
    print("один dx", vector, "SAD", error)
right = [[sample(ref[y],x+(-1 if y%2==0 else 1)) for x in range(4)]
         for y in range(4)]
error = sum(abs(cur[y][x]-right[y][x])
            for y in range(4) for x in range(4))
print("раздельные dx полей SAD:", error)
frame = [[0,0], [10,10], [0,0], [10,10]]
differences = [frame[y+1][0]-frame[y][0] for y in range(3)]
print("вертикальные разности кадра:", differences)
print("разности внутри полей:",
      [frame[2][0]-frame[0][0],frame[3][0]-frame[1][0]])
↳  выводpython3 warp_fields.py
warp: [5.0, 10.0, 15.0, 20.0] остаток: [1.0, 1.0, -1.0, 1.0]
восстановление: [6.0, 11.0, 14.0, 21.0]
один dx -1 SAD 40.0
один dx 0 SAD 80.0
один dx 1 SAD 40
раздельные dx полей SAD: 0.0
вертикальные разности кадра: [10, -10, 10]
разности внутри полей: [0, 0]

В задаче главы тот же механизм вычисляется целыми числами с удвоенным масштабом. Например, источник 1,5 кодируется числителем 3 при знаменателе 2. Предсказание 15 представляется целым 30, остаток−1 представляется−2. Это позволяет сосредоточиться на границах и адресах без особенностей печати десятичных дробей ограниченным учебным движком.

Разбор: один вектор против двух полей

Во втором опыте опорный кадр 4×4 имеет яркий отсчёт в колонке 1 у строк 0,2 и в колонке 2 у строк 1,3. Новый кадр сдвинул первый набор строк вправо, а второй влево. Это специально маленькая модель разного движения в два момента, без шума и остатка.

Полный перебор общих dx∈{−1,0,1} даёт SAD40,80,40. При dx=−1 верно предсказывается первое поле, но второе остаётся неверным. При dx=1 роли меняются. Если каждой группе строк разрешить своё предсказание, dx_even=−1 и dx_odd=1 дадут SAD0. Знаки соответствуют принятой адресации от текущего места к старому источнику.

Это не означает, что два вектора всегда выгоднее одного: они требуют дополнительных битов и сигнализации режима. У неподвижной сцены оба поля могут хорошо описываться общими параметрами. Выбор оценивают в контуре сжатия, а не по правилу «два варианта сложнее, значит обязательно лучше». Реальные режимы MPEG-2 различают также поле-источник и структуру картинки.

Разбор: какие строки подать в преобразование

Рассмотрим столбец объединённого кадра [0,10,0,10]. Обычные соседи по строкам дают разности [10,−10,10]. Но первое поле состоит из строк 0,2 со значениями [0,0], второе - из строк 1,3 со значениями [10,10]. Внутри каждого поля разность 0.

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

В MPEG-2 структура предсказания и выбор кадрового/полевого ДКП - отдельные инструменты с конкретной сигнализацией. Наш маленький столбец не заменяет нормативные блоки 8×8: он показывает, почему группировка по времени может уменьшить ложные высокие вертикальные колебания. Это объясняет механизм, который не виден в одном сравнении weave и bob.

Что ломается без этого

Деинтерлейсинг для экрана выдают за обязательный шаг всякого MPEG-2. Но кодер может сохранять чересстрочную структуру и использовать полевые инструменты, а преобразование для прогрессивного показа выполнить позже. Не нужно заранее уничтожать временную информацию, если задача - сохранить источник.

При уменьшении изображения недостаточно просто редко брать исходные отсчёты: мелкие детали способны превратиться в ложные крупные узоры. Для качественного resampling нужен подходящий фильтр перед редкой выборкой. Наше линейное упражнение не обещает устранить все такие эффекты; оно фиксирует простую вычислимую модель предсказания и её границы.

Зачем это в работе

При разборе архивного видео проверь порядок полей, временные метки, кодируемую структуру и настройки изменения размера. Проблема «края двоятся» может быть связана с ошибочной фазой полей, а проблема «остаток не сходится» - с другим фильтром опоры. Это разные дефекты с разными местами исправления.

Для сравнения моделей сохрани таблицу: разрешённые векторы, SAD, цена параметров и ошибка окончательной реконструкции. Так можно увидеть, помог ли полевой режим описать настоящее временное различие или только добавил параметры к почти неподвижному фрагменту.

Теперь сам

Опора [2,6,10], источник u=0,5x. Для текущей строки [3,5,8] найди предсказание при x=0,1,2 и остаток. А у столбца [4,9,4,9] каковы две строки полей?

Ответ. Источники 0;0,5;1 дают [2,4,6], остаток [1,1,2]. Первое поле [4,4], второе [9,9]. Обе группы постоянны, хотя объединённый столбец чередует значения. Ни одна из этих операций сама по себе не определяет порядок показа: время задаётся отдельно.

Главное

Опора - это результат определённого вычисления на определённой сетке и во времени. Деформация и полевые режимы меняют это вычисление; одинаковый остаток имеет смысл только вместе с тем же способом получения предсказания.

Комментарии

Пока нет комментариев. Будь первым!

Оставить комментарий

Комментарий появится после проверки. Email не публикуется. Войти, чтобы не вводить имя каждый раз.