LeakKernelDeint

Общая информация

Автор: Leak (Kurt B. Pruenner)
Версия: 1.5.4 (основан на фильтре KernelDeint 1.4.0by Donald A. Graft)
Загрузка:
Категория: деинтерлейс и устранение pulldown
Требования: цветовые пространства YV12 & YUY2 & RGB
лицензия: GPL

Введение

Этот фильтр делает деинтерлейс (удаление чересстрочности), используя ядерный (матричный взвешенный, kernel) подход. Это дает значительно улучшенное вертикальное разрешение в деинтерлейсных областях по сравнению с простым отбрасыванием поля.

Если вы устанавливаете порог фильтра в 0, вы получите результат, совершенно свободный от артефактов, но при этом с меньшей потерей вертикального разрешения, чем простое отбрасывание одного поля. Для дальнейшего улучшения результата установите некоторый порог фильтра, определяющий величину движения: если движение меньше порога, то область считается статической и не обрабатывается (при этом сохраняется полное вертикальное разрешение), а в движущихся областях применяется матричная (kernel-based) интерполяция, что позволяет сохранить более высокое вертикальное разрешение, чем отбрасывание одного поля с последующей обычной интерполяцией.

Кроме того, в данной версии присутствует функция LeakKernelBob()(адаптированная из одноимённого скрипта от Scharfis_brain), которая выдаёт клип с удвоенной частотой кадров по принципу Bob-деинтерлейса.

Фильтр работает в цветовых пространствах RGB, YUY2 или YV12.

Чтобы применять фильтр для постобработки после Telecide(), используйте следующий скрипт:

Telecide(..., post=1, hints=true)
LeakKernelDeint(...)

 


Синтаксис

LeakKernelDeint() имеет следующие именованные параметры:

order (0-1, по умолчанию не задан!) Этот параметр определяет порядок полей в клипе. Чрезвычайно важно задать его правильно. Используйте order=0 для задания нижнего поля первым (bff), order=1 для верхнего поля первым (tff). Параметр необходим, при его отсутствии фильтр возвращает ошибку. Так как этот параметр имеет ключевое значение, рекомендуется не делать предположений о порядке полей, а определить его явным образом, используя следующую методику:

Создайте скрипт AVISynth, выдающий входной файл без всякой обработки. Например, если это AVI файл, то используйте AviSource (прим.перев.: или лучше OpenDMLSource) Добавьте строку, разделяющую поля в предположении верхнего поля первым:

AviSource("your_clip.avi")
AssumeTFF().SeparateFields()

Загрузите этот скрипт в VirtualDub, отыщите сюжет с движением и просматривайте его покадрово. Если движение происходит всегда в правильном направлении, то всё в порядке и наше предположение о верхнем поле первом было справедливо. Если движение дёрганное ("шаг назад, три шага вперед, шаг назад, три вперед..."), то попробуйте поменять AssumeTFF на AssumeBFF, если после этого всё встанет на свои места, то видео имеет нижнее поле первое. (прим.перев.: картинка при такой проверке может немного дрожать по вертикали, это нормально. нужно искать горизонтальное движение и смотреть по нему. Кроме того, есть и более автоматизированные способы определения порядка полей, например, скрипт CheckTopFirst)

threshold (0-255, по умолчанию 10) Этот параметр определяет порог движения. Движущиеся области подвергаются деинтерлейсингу с применением матричного подхода, статические оставляются без изменений. Используйте параметр map для тонкой настройки порога: только области с "гребёнкой" должны деинтерлейситься.

sharp (true/false, по умолчанию false) Установка этого параметра в true задаёт ядро интерполяции, которое обеспечивает более высокое вертикальное разрешение, но при этом поднимает резкость изображения (sharpen), что может давать некоторые артефакты на контрастных деталях.

twoway (true/false, по умолчанию false) Установка в true этого параметра задаёт ядро, включающее и предыдущее, и последующее поле для интерполяции. В противном случае используется только предыдущее поле, что даёт более чёткую картинку и меньше смешивает кадры (что положительно сказывается на anime), а также быстрее. Параметр twoway включён для совместимости с предыдущими версиями, где подразумевалось использование двух полей.

map (true/false, по умолчанию false) Установка map=true включает режим показа движущихся областей, определяемых параметром threshold. Используйте для настройки порога определения движения.

linked (true/false, по умолчанию false; только для YV12/YUY2). Этот параметр, будучи установлен в true, связывает движущиеся области (маску движения) в цветовых плоскостях яркости и цветности. Таким образом, они одновременно считаются движущимися или нет. Используйте параметр, если вы замечаете остаточные артефакты в областях, частично подвергнутых деинтерлейсу и интерполяции. Впрочем, большая часть искажений цветности, возникавших в версии 1.4.0, ликвидирована путём использования общей маски движения для двух плоскостей цветности, так что этот параметр, объединяющий маску движения для всех трёх плоскостей, требуется редко и по умолчанию отключён. Также его вряд ли следует включать, если видео содержит радужные разводы (rainbows), т.к. он будет интерполировать плоскость яркости в областях этих цветовых помех, ухудшая таким образом качество видео.

debug (true/false, по умолчанию false) Включает вывод отладочной информации для DebugView. В нынешней версии информация заключается в номере версии и "подсказках" (hints) от фильтра Telecide() о том, является кадр прогрессивным или чересстройным. Если подсказки отсутствуют, все кадры считаются чересстрочными.

forceCPU (0-5, по умолчанию 0). Этот параметр предписывает использовать определённые процессорные оптимизации:
0 ... автоопределение
1 ... без оптимизаций (C++)
2 ... Использовать набор инструкций MMX, где возможно
3 ... Использовать MMX и Integer SSE
4 ... Использовать MMX и SSE
5 ... Использовать MMX, SSE и SSE2, где возможно.

NB: в данной версии реализованы только оптимизации MMX, так что установка параметра выше 2 не даст прибавки к скорости.

Изменения версий

1.5.0
Первая версия (MMX)

1.5.1
Исправлено: попытка чтения за последним кадром;
Изменено: небольшое ускорение за счёт чтения коэффициентов из памяти.

1.5.2
Исправлено: маска движения была подпорчена из-за перепутанного порядка полей;
Исправлено: порог был меньше на единицу;
Исправлено: в режиме map=true значения яркости ограничены 235.

1.5.3
Изменено: фильтр переименован в LeakKernelDeint по просьбе Donald Graft.
Исправлено: подразумевалось "AssumeFrameBased" при использовании LeakKernelBob.

1.5.4
Исправлено: в функции LeakKernelBob размер кэша был слишком малым, что ухудшало производительность.

 


Kurt B. Prunner
Мой сайт: http://gast3.ssw.uni-linz.ac.at/~kp/AviSynth
Сайт Donald Graft: http://neuron2.net/

Обсуждение на doom9: http://forum.doom9.org/showthread.php?threadid=81322

$English Date: 2005/10/01 23:09:51 $
Русский перевод 25.06.2005 Eugene Vasiliev (eugvas@mccme.ru)