# DeScratch

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

автор: Александр Г. Балахнин aka Fizick
версия: 0.9.0.0
закачка: http://avisynth.org.ru/
категория: Плагины для телепередач (не знаю, почему его так классифицировали :-)
требования: YV12 цветовое пространство

### Назначение

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

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

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

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

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

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

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

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

Программа является плагином (фильтром) для Avisynth 2.5
Тестировалась с версией 2.55 (некоторые версии имеют ошибку с поворотом `Turnleft()`!).
Новые версии с 0.3 не нуждаются в Avisynth C Interface (avithynth_c.dll).
Компилирован с 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)

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

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

mindif - минимальное различие яркости царапины от соседних пикселов для канала яркости
(от 1 до 255, по умолчанию 5)
asym - максимальная асимметрия соседних пикселов (от 0 до 255, по умолчанию 10
maxgap - максимальный смыкаемый вертикальный зазор частей царапины (от 0 до 255, по умолчанию 3)
maxwidth - максимальная ширина царапины (1 или 3, по умолчанию =3)
minlen - минимальная длина царапины (по умолчанию 100)
maxlen - максимальная длина царапины (по умолчанию 1000)
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)
( устанавливает отвергнутые экстремумы в серый цвет, а царапины - в белый или черный)

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

Вы ДОЛЖНЫ подобрать параметры, подходящие для Вашего видео.
Используйте команды 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.

### История версий и загрузка:

- Версия 0.1, 22 Декабря 2003 - начальная бета (не публикована)
- Версия 0.2, 31 Декабря 2003 - первая публичная.
  - Введены резкие экстремумы;
  - добавлено смыкание зазоров.
- Версия 0.3 14 Июля 2004
  - переделана в родной Avisynth плагин;
  - Увеличена скорость работы путем применения функций изменения размеров Avisynth для смазывания.
- Версия 0.4, 17 июля 2004
  - Добавлено обработка цветовых каналов: параметры modeY, modeU, modeV введенные в версии 0.4 по просьбе Ivo (старые версии обрабатывали только яркостный канал);
  - mindif теперь только положительна;
  - величина помеченных царапин теперь не инвертируется, а контрастируется до предела.
- Версия 0.5, 31 июля 2004
  - Исправлена ошибка указателя чтения-запись;
  - добавлен параметр mindifUV для отдельного контроля очистки цветовых плоскостей U, V;
  - некоторая реорганизация кода;
  - скорректирована документация.
- Версия 0.6, 23 августа 2004 - Исправлена ошибка переполнения байта (ограничен 0-255)
- Версия 0.7, 15 ноября 2004 - добавлена проверка асимметрии (параметр asym);
- Версия 0.8, 13 Марта 2005 - добавлен параметр maxlen;
- Версия 0.9, 31 Марта 2005 - частично расфиксирован параметр maxwidth, допустимо =1 или 3 (было только 3);
- Версия 0.9.0, 15 июня 2005 - только документация переформатирована
- Версия 0.9.0.0, 9 сентября 2006 - исходники лицензированы под GNU GPL лицензией версии 2.

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

Максимальная ширина царапины фиксирована 1 или 3.
Плагин работает только в цветовой системе YV12.

`$English Date: 2006/12/15 19:29:25 $
Русский текст 17.09.2006 Fizick http://bag.hotmail.ru`