Показать сообщение отдельно
Старый 30.07.2008, 15:04   #6
Polad
Кинооператор
Медаль пользователю. ЗОЛОТО Любитель
Аватар для Polad
Регистрация: 30.03.2007
Адрес: Тридевятое царство
Сообщения: 267
Репутация: 41
6. Работа с чересстрочным видео

В кино в каждый момент времени снимается кадр целиком. В традиционном (чересстрочном) телевидении и видео (за исключением недавно появившихся прогрессивных стандартов) каждый кадр состоит из строк, образующих два поля, снятых в разные моменты времени. В один момент снимаются четные строки (первое, верхнее поле), в следующий момент — нечетные (второе, нижнее поле), и так далее. Однако кино часто показывают по телевидению (и записывают на DVD), в странах с разной системой телевидения и, соответственно, с разными частотами кадров, не совпадающими с частотой кадров кинофильма. В этом случае студии производят либо ускорение видео (с 24 до 25 Гц для PAL) либо повтор некоторых полей по определенному алгоритму (Pulldown) или (что хуже) смешение (blend). Обработку видео (например, фильтрацию) желательно вести в том виде, в котором оно существовало изначально.
Начнем с рассмотрения простого случая истинного чересстрочного видео, снятого видеокамерой. Наиболее естественным (для сохранения плавности движений) является сохранение чересстрочности при обработке, кодировании и записи DVD. Обработку видео целесообразно вести, разделив его на поля, или использовать функции-фильтры, имеющие опцию обработки видео как чересстрочного.
Avisynth имеет функцию SeparateFields для разделения кадров видео на поля (с удвоением частоты) и функцию Weave для их обратного сцепления в кадры.
#Пример скрипта 6.1.
# Применение пространственного фильтра
# к чересстрочному видео, разделенному на поля
LoadPlugin("C:PluginsVagueDenoiser.dll") # загружаем плагин
AviSource("d:videofilm.avi") # открываем видеофайл
SeparateFields() # разделяем видео на поля
VagueDenoiser(threshold=2)
# фильтруем каждое поле пространственным фильтром
Weave() # соединяем поля в кадры
В данном примере 6.1 мы использовали для снижения шума один из лучших пространственных фильтров (функция VagueDenoiser), который исполнен как плагин (файл VagueDenoiser.dll, разработчики "Lefungus", "Kurosu", "Fizick"), и поэтому сначала должен быть загружен (автоматически или явно, наглядней в начале скрипта). Сила (порог) фильтрации задан параметром threshold=2, остальные параметры со значениями по умолчанию.
Еще обратите внимание на такую мелочь, что в функциях без аргументов мы пишем пустые скобки (работать фильтр будет и без них, но без кэширования, медленнее — это будет исправлено с версии AviSynth 2.5.7).
#Пример скрипта 6.2
# Применение к чересстрочному видео пространственного фильтра,
# имеющего опцию работы чересстрочно (interlaced)
LoadPlugin("C:PluginsVagueDenoiser.dll") # загружаем плагин
AviSource("d:videofilm.avi") # открываем видеофайл
# фильтруем каждое поле пространственным фильтром,
# включив опцию чересстрочности
VagueDenoiser(threshold=2, interlaced=true)
Более сильную фильтрацию обеспечивают временные фильтры, учитывающие информацию и о соответствующих точках в соседних кадрах, или пространственно-временные, рассматривающие соседние точки в пространстве и во времени.
Так как строки содержат информацию о сдвинутых по вертикали на одну строку точках, то после разделении на поля информация в соответствующих строках не относится к тому же месту пространства, и не должна быть смешена. Поэтому из потока полей выделяют поток четных полей и поток нечетных полей, в каждом из которых информация относится к соответствующим (несмещенным) точкам.
#Пример скрипта 6.3
# Применение пространственно-временного фильтра
# к чересстрочному видео
с разделением на четные и нечетные поля
LoadPlugin("C:PluginsDeGrainMedian.dll") # загружаем плагин
AviSource("d:videofilm.avi") # открываем видеофайл
SeparateFields() # разделяем видеокадры на поля
# Выделяем четные (0,2,4…) поля в переменную Even
Even = SelectEven()
# фильтруем четные поля и замещаем Even результатом
Even = DeGrainMedian(Even)
# Выделяем нечетные (1,3,5,…) поля в переменную Odd
Odd = SelectOdd()
# фильтруем четные поля и замещаем Odd результатом
Odd = DeGrainMedian(Odd)
Interleave(even, odd) # чередуем четные и нечетные поля,
# собирая исходную последовательность (0,1,2,3,4,5…)
Weave() # соединяем поля в кадры
Некоторые фильтры, в том числе используемый тут DeGrainMedian, имеют опцию обработки чересстрочного видео, при этом они реализуют этот же алгоритм раскладки на поля внутренне, в этом случае скрипт упрощается.
#Пример скрипта 6.4
# Применение к чересстрочному видео пространственно-временного
# фильтра,
имеющего опцию работы с чересстрочным видео
LoadPlugin("C:PluginsDeGrainMedian.dll") # загружаем плагин
AviSource("d:videofilm.avi") # открываем видеофайл
DeGrainMedian(interlaced=true) # фильтруем чересстрочно