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

Деинтерлейс применяют для удаления эффектов «гребенки» чересстрочного видео для комфортного просмотра на мониторе компьютера (на телевизоре эта гребенка будет не видна). Можно выделить случай, когда видео изначально было прогрессивным (фильмом), для преобразования в видео было применено некое чередование полей (telecine, pulldown), и нам необходимо выделить из видео последовательность оригинальных кадров. При этом имеется в виду, что смешения полей нет, и вся трудность просто в нахождении нужных. В простом случае фильма в NTSC можно воспользоваться базовой функцией Pulldown. Можно использовать и детально использовать богатые возможности AviSynth по разложению на поля, их ручном анализе, и составлением некоторого скрипта для их комбинации. В более сложных реальных случаях для автоматизации процесса целесообразно применять плагины DeComb (разработчик Donald Graft) или TIVTC (разработчик "Tritical"), реализующие методы подбора полей (field matching) из нескольких соседних кадров для восстановления прогрессивных кадров, в основном для формата NTSC, в том числе из гибридного видео и др. Оба плагина состоят из двух главных функций, на первом этапе осуществляющих подбор подходящих полей и формирование кадров, а на втором этапе — отбрасывание ненужных дубликатов (децимацию). Между собой они могут общаться с помощью подсказок, спрятанных в кадре. Плагин TIVTC активно разрабатывается в настоящее время и имеет несколько больше возможностей. Основными (базовыми) параметрами его функции TFM являются:
  • "order" — порядок полей (0 — BFF, 1 — TFF, -1 = из AviSynth, по умолчанию);
  • "mode" — режим от 0 до 6, грубо чем больше, тем больше соседних полей пробуется, и еще специальный режим 7, по умолчанию =1 (два соседних поля и одно следующее при неудаче);
  • "PP" — пост-обработка, от 0 до 7, что делать с плохими кадрами (с гребенкой) при неуспехе подбора полей, имеется в виду возможность попиксельного деинтерлейса (0 — без обработки, 1 — искать плохие, выводить подсказку, но не обрабатывать, 2 — простой деинтерлейс смешением, 3 — простой деинтерлейс кубической интерполяцией, 4 — простой деинтерлейс с улучшенными краями (ELA), 5 — адаптивный к движению деинтерлейс смешением, 6 — адаптивный к движению деинтерлейс кубической интерполяцией, 7 — адаптивный к движению деинтерлейс с улучшенными краями (ELA), по умолчанию = 6).
В разработках "Tritical" TIVTC и TDeint мы видим сближение методов деинтерлейса по полям и по точкам.
#Пример скрипта 7.1
# Простой подбор полей для PAL без децимации
LoadPlugin("C:PluginsDGdecode.dll") # для MPEG2
LoadPlugin("C:Pluginstivtc.dll") # для TFM
MPEG2Source("d:videofilm.avi") # файл видео
TFM(mode=1, PP=6)
# делаем деинтерлейс подбором полей и пост-обработкой

Для мультфильмов рекомендуют режим PP=7 со сглаженными наклонными краями. Для NTSC необходима еще и функция децимации TDecimate сразу за TFM. Функции имеют многочисленные настроечные параметры, в том числе для прямого задания пользователем типа деинтерлейса для конкретных кадров.
Разработан плагин RestoreFps, а также сложные AVS скрипты для трудных случаев восстановления прогрессивных кадров из потока после телекино-преобразования, в том числе и частично смешенных (blended) полей, такие как Restore24 (составители "scharfis_brain", "Didee"), CDeblend, MRestore, CRestore (составитель "MOmonster"). Автор не является в этом вопросе опытным, однако рассмотреть их целесообразно. Ограничимся кратким описанием последней, не приводя саму функцию скрипта (найдете ее в архиве avs.zip). В ней сначала производится вычисление масок сравнения, а затем покадровые вычисления и нахождение наиболее походящих полей с использованием команд условной обработки ScriptClip и FrameEvaluate. Параметрами функции Crestore являются:
  • mode: режим детектирования смешенных полей, от -1 до 10, по умолчанию 0.
    меньше 0 — быстрые режимы, больше 0 — высококачественные. Чем больше модуль, тем выше влияние движения, 0 — без влияния движения. Для природы хорошо от 0 до 2, для мультфильмов до 4-5
  • rate: выходная частота кадров, обычно 23,976 (по умолчанию) или 25 fps, прореживания не производится
  • bthresh: порог детектирования смешения. От 0 до 99 — простое использование порога
    Выше 99 — специальная обработка. Если текущий кадр имеет большую вероятность смешения, чем соседние, и фактор выше bthesh/100-1, то это — смешение (blend). По умолчанию 120
  • dl: предел детектирования для mode >= 0. Не учитываются пиксели с меньшей разницей. От 0 для хороших источников до 2-4 для мультфильмов, по умолчанию 1
  • clip2: необязательный вспомогательный (очищенный) клип (bobbed) для более надежного детектирования
  • nomo: точка отсутствия движения. Разности смешенных пикселей вычитаются из нее, чистых пикселей прибавляются. Хорошие величины 255, 128. Для bthresh
  • mthresh: для простого порога движения. При разности кадров меньше mthresh, смешение не будет детектировано. По умолчанию 0.16
Функция Crestore (в последнем варианте 1.0) использует функции плагина MaskTools новой версии 2.0 (разработчик "Manao") , на ее входе должно быть видео после Боб-деинтерлейса (кадры удвоенной частоты и полной высоты, из каждого поля, см. ниже). Функцию можно, например, импортировать из файла.
#Пример скрипта 7.2
# Восстановление прогрессивных кадров из потока после телекино
LoadPlugin("C:Pluginsmt_masktools.dll") # для масок
LoadPlugin("C:PluginsDGdecode.dll") # для MPEG2
LoadPlugin("C:PluginsTDeint.dll") # для Боб-деинтерлейса
Import("crestore.avs") # импортируем файла скрипта с функцией Mpeg2Source("d:videofilm.d2v") # открываем файл видео
# подразумеваем, что из MPEG2 получен правильный порядок полей TDeint(mode=1) # делаем Боб-деинтерлейс
# И вызываем функцию для восстановления прогрессива Crestore(mode=0, rate=25, bthesh=120)
# попробуйте подобрать некоторые параметры
Другой случай — применение деинтерлейса с восстановлением смежного поля некоторой интерполяцией точек изображения, обычно с некоторой адаптацией к движению (по-разному в статичных и движущихся областях). Для изначально чересстрочного видео деинтерлейс вреден, так как уменьшается плавность движений, но иногда он нужен при обработке фильмов.
Имеются классический плагин KernelDeint (разработчик Donald Graft) и его оптимизированная версия LeakKernelDeint (разработчик "Leak"), великолепный быстрый TomsMoComp (разработчик Tom Barry) с небольшой компенсацией движения, и развивающийся в настоящее время продвинутый TDeint (разработчик "Tritical") с пониженной ступенчатостью краев объектов, анализом перекрывающихся областей и другими режимами.
#Пример скрипта 7.3
# Деинтерлейс
LoadPlugin("C:PluginsTomsMoComp.dll") # загружаем плагин
LoadPlugin("C:PluginsDeGrainMedian.dll") # загружаем плагин
AviSource("d:videofilm.avi") # аналоговое видео
AssumeTFF() # сообщим порядок полей — верхнее поле первое
#Info() # Уберите знак комментария для просмотра свойств
TomsMoComp(-1, 5, 0) # делаем деинтерлейс
DeGrainMedian(interlaced=false) # фильтруем прогрессивно
В данном примере мы используем вызов функции TomsMoComp с первым параметром -1, что означает (согласно документации) считать порядок полей тем, каким его считает AviSynth. Это довольно тонкий вопрос. В записанном видеофайле AVI не хранится информация о чересстрочности, и отсутствует информация, какое поле в кадре первое во времени. Известно, однако, что для AVI-файлов формата DV (с цифровых видеокамер) первое поле — всегда нижнее. Именно это значение считает AviSynth по умолчанию для любого видео, если нет явного задания порядка полей. Отметим, что в большинстве плат захвата аналогового видео (в том числе на чипах Philips) — верхнее поле является первым. В рассмотренном примере мы явно указали, что верхнее является первым (Top Field First). При неверно указанном порядке полей ряд функций будет работать неправильно. В файлах MPEG2 такая информация имеется, и она передается в AviSynth при использовании MPEG2Sourсe пакета DGDecode.
В этом случае, как и во многих других, полезно использовать отладочный фильтр Info(), который печатает поверх кадра некоторую информацию о свойствах некоторого клипа (по умолчанию — LAST) в данном месте скрипта.
Выбор лучшего фильтра деинтерлейса неоднозначен. При обработке фильмов PAL рекомендую попробовать TDeint, который имеет большое число настроечных параметров, в том числе и режим анализа перекрывающихся областей, адаптивного перехода к автоматическому подбору наиболее подходящих соседних полей (параметр tryWeave), есть в нем и режим сглаживания ступенек (параметр mode=3). Но начать можно с настроек по умолчанию. Преимуществом TomsMoComp является компенсация движения (хоть и в пределах 1-2 пикселей). Хорошие результаты при высокой скорости обработки дает новый плагин деинтерлейса Yadif, перенесенный мной в AviSynth из MPlayer (разработчик Michael Niedermayer).
Еще одним специальным видом деинтерлейса является так называемой Боб (английское Bob, покачивание) — преобразование каждого поля в полноформатный кадр, с сопутствующим увеличением частоты кадров вдвое, из 25 в 50 Гц (каждое поле, а теперь кадр, соответствует своему моменту времени). Это создает видео, очень плавно меняющееся во времени, что используется в ряде программ просмотра MPEG и телевидения. Во встроенном фильтре Bob промежуточные строки строятся путем бикубической интерполяции соседних строк (с некоторым смещением). В более разумных (Smart) бобберах частично адаптивно используется информация из соседних полей. Практически каждый фильтр деинтерлейса имеет и этот режим: KernelBob, LeakKernelBob, TDeint. Боб-деинтерлейс часто используют при пост-обработке для просмотра видео на мониторе в реальном времени, но и в Avisynth он тоже находит применение. Его используют при преобразовании телевизионных форматов с разной частотой кадров и прогрессивностью (PAL-NTSC). Есть у него некоторые преимущества и при фильтрации шумов. Так как имеем фактически прогрессивный выход с удвоенной частотой, то временной интервал меньше в два раза, чем при обработке временным фильтром интерлейсного клипа с разложением на четные и нечетные строки. Недостатком является меньшая скорость работы и некоторое вертикальное покачивание (bobbing) статичных объектов даже для разумных бобберов.
#Пример скрипта 7.4
# Фильтрация боб-деинтерлейсного видео
LoadPlugin("C:PluginsDeGrainMedian.dll") # загружаем плагин
AviSource("d:videofilm.avi") # аналоговое видео
AssumeTFF() # сообщим порядок полей — верхнее поле первое
TDeint(mode=1) # боб-деинтерлейс, полные кадры
# четные строки — исходные, нечетные — интерполяция,
# в следующем кадре наоборот
DeGrainMedian(interlaced=false) # фильтруем прогрессивно
AssumeFrameBased() # полагаем что кадр
SeparateFields() # разделим на поля
SelectEvery(4,1,2) #выделим из четырех второе и третье поле
Weave()
Отметим, что даже если некоторый фильтр деинтерлейса не имеет режима BOB (например, TomsMoComp), его можно реализовать, применяя поочередно к исходному и смещенному на одно поле видео, что может быть записано с помощи функции.
#Пример скрипта 7.5
# Определение функции TomsBob (составитель scharfis_brain)
function tomsbob(clip i)
{
interleave(i.tomsmocomp(-1, 0, 0),
i.doubleweave().selectodd().tomsmocomp(-1, 0, 0))
assumeframebased()
getparity(i) ? assumetff() : assumebff()
}
Для использования этой функции в приведенном выше примере скрипта 7.4, запишите ее определение в скрипт (перед основным текстом), и используйте вызов Tomsbob() вместо строки TDeint(mode=1).