DeScratch - Фильтр для удаления царапин

Плагин для AviSynth 2.5
Версия 1.1
Copyright (C)2003-2016 Александр Г. Балахнин aka Fizick
http://avisynth.org.ru

Назначение

Плагин удаляет вертикальные царапины с кинофильмов. Также он может удалять горизонтальные линии помех типа выпадения сигнала при аналоговом захвате с VHS (после поворота изображения).

Как он работает

Плагин сначала обнаруживает царапины, затем удаляет их.
Он работает с каждым кадром, используя только пространственную информацию текущего кадра.
Я адаптировал его к реставрации моих старых 8 мм кинопленок, возможно он окажется полезным кому-нибудь еще.

Обнаружение царапин

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

Удаление царапин

Царапины могут быть либо частично прозрачными, плавными (с деталями картинки), либо непрозрачными (без деталей или почти полностью поврежденными).
В первом случае можно вычесть сглаженную часть вариации точек царапины из образа. Следовательно, детали изображения останутся.
Во втором случае плагин заменяет пикселы царапины на среднее из некоторых соседних пикселов в той же строке.
Мы можем также иметь промежуточный случай, установив процент сохранения деталей.
Во всех случаях, могут частично заменяться и некоторые соседние пикселы для плавного перехода.

Необходимые программы

Программа является плагином (фильтром) для Avisynth 2.5
Тестировалась с версией 2.55 до 2.5.8. Должна работать с 2.6.0
Компилирован с MS VC++ Toolkit 2003.

Синтаксис вызова

DeScratch(int mindif, int asym, int maxgap, int maxwidth, int minlen, int maxlen, int maxangle, int blurlen, int keep, int border, int modeY, int modeU, int modeV, int mindifUV, bool mark, int minwidth, int left, int right)

Все параметры именованные и опциональны.

Параметры плагина:

mindif - минимальное различие яркости царапины от соседних пикселов для канала яркости
    (от 1 до 255, по умолчанию 5)
asym - максимальная асимметрия соседних пикселов (от 0 до 255, по умолчанию 10
maxgap - максимальный смыкаемый вертикальный зазор частей царапины (от 0 до 255, по умолчанию 3)
maxwidth - максимальная ширина царапины (нечетная от 1 до 15, по умолчанию =3)
minlen - минимальная длина царапины (по умолчанию 100)
maxlen - максимальная длина царапины (по умолчанию 2048)
maxangle - максимальный угол к вертикали (в градусах, по умолчанию=5)
blurlen - радиус вертикального смазывания для анализа кадра (по умолчанию = 15)
keep - процент удерживаемых деталей царапины (по умолчанию = 100)
border - толщина бордюра вокруг царапины для частичной реставрации (по умолчанию=2)
modeY - режим обработки канала яркости (0 - нет, 1 - низкие(черные), 2 - высокие(белые), 3 - оба, по умолчанию=1)
modeU - режим обработки цветового канала U (0 - нет, 1 - низкие(зеленые), 2 - высокие(красные), 3 - оба, по умолчанию=0)
modeV - режим обработки цветового канала V (0 - нет, 1 - низкие(желтые), 2 - высокие(голубые), 3 - оба, по умолчанию=0)
mindifUV - минимальная различие яркости царапины от соседних пикселов для каналов цветности
    (от 0 до 255, по умолчанию 0):
    если =0, то внутреннее значение mindifUV> равно mindif.
mark - помечать ли царапины в режиме отладки (true или false, по умолчанию =false)
    ( устанавливает отвергнутые экстремумы в серый цвет, а царапины - в белый или черный)
minwidth - минимальная ширина царапины (нечетная от 1 до 15, по умолчанию =1)
left - левая граница обрабатываемого окна (включительно), по умолчанию=0
right - правая граница обрабатываемого окна (не включительно), по умолчанию=ширина кадра или 4096

Параметры maxgap, maxwidth, minwidth, minlen, blurlen, border, left, right измеряются в пикселах.

Вы ДОЛЖНЫ подобрать параметры, подходящие для Вашего видео.
Используйте команды AviSynth Greyscale(), UtoY(), VtoY(), и параметр mark для отладки и настройки.

Примеры

Старая 8 мм кинопленка. Верхняя половина кадра - до фильтра, нижняя половина - после фильтра.

Пример скрипта (использованный для показанного примера) :

AviSource("input.avi")
LoadPlugin("descratch.dll")
ConvertToYV12()
DeScratch(mindif=2)

Удаление помех в виде горизонтальных линий

Такие длинные тонкие горизонтальные линии иногда проявляюся в захваченном с аналоговых источников материале (пропуск линий ТВ-тюнером или видеомагнитофоном VHS и т.д). Эта проблема обсуждалась на Doom9, смотри статью Removal of clicks and scratches (July 10-31, 2004). Но в статье первоначально использовался плагин DeSpot, который не очень подходит для этой задачи, из-за очень слабого уровня помехи. DeScratch мог бы быть более эффективен, однако и он не идеален тоже (старые версии обрабатывали только яркостную составляющую). Конечно, вы должны повернуть кадр для обработки Descratch (и не забыть повернуть его обратно после очистки :-).

Посмотрите на результаты для одной из VHS записей (от Ivo).
Верхняя половина кадра - до фильтра, нижняя половина - после фильтра:

Использованный для VHS пример скрипта:

LoadPlugin("descratch.dll")
AviSource("drop-outs_.avi")
ConvertToYV12()
Crop(0,0,-0,288) # выберем верхнюю часть кадра чтобы сохранить экранное место
input=last
AssumeTFF()      # просто для порядка
SeparateFields() # для аналогового чересстрочного видео
TurnLeft()       # повернем кадр на 90 градусов налево (против часовой)
DeScratch(mindif=4, maxgap=20, minlen=300, blurlen=50, keep=100, border=0, maxangle=0)
TurnRight()      # повернем обратно, на 90 градусов направо (по часовой)
Weave()          # восстановим поля
StackVertical(input, last) # Сравним кадр источника и кадр после удаления царапин

Использованы оптимальные значения параметров - большая длина minlen, нулевой угол maxangle.

Для удаления цветных помеховых линий, вы можете использовать режимы modeU, modeV и mindifUV.

Дополнительная информация

Обсуждение плагина - на форуме doom9, ветка http://forum.doom9.org/showthread.php?s=&threadid=67794

Лицензия

Данная программа распространяется свободно, под лицензией GNU GPL v2.
Прошу материальной поддержки.

История версий

Ограничения текущей версии:

Плагин работает только в цветовой системе YV12.

Загрузка

Download DeScratch version 1.1

Вернуться на главную страницу