Плагин для AviSynth 2.5
Версия 3.6.1
Copyright (c)2003-2009 Александр Г. Балахнин aka Fizick
http://avisynth.org.ru
Данный фильтр разработан для удаления временного шума в форме точек (пятен) и полосок, имеющихся в некоторых видео.
Фильтр полезен для реставрации кинофильмов путем удаления случайных
помех в виде темных пятен от пыли и некоторых полос от
царапин на оцифрованных кинопленках.
Плагин основан на условном временном медианном
фильтре Conditional Temporal Median Filter v.0.93 (C-plugin for Avisynth 2.5)
by Kevin Atkinson http://kevin.atkinson.dhs.org/temporal_median/
(эта документация также основана на нем.)
Пример полукадра старой 8мм кинопленки (вверху - до фильтра, внизу - после действия фильтра):
Avisynth скрипт-файл для примера, показывающий возможности старой базовой версии 0.93, но адаптированный для версии 3.2:
AviSource("film8mm.avi") LoadPlugin("despot.dll") ConvertToYV12() Crop(0,0,720,288) # чтобы показать тест i = last # Сравним полу-кадры с и без подавлением шума DeSpot(p1=35, p2=14, pwidth=70, pheight=70, mthres=25, mwidth=20, mheight=15, interlaced=false, \ merode=33, ranked=false, p1percent=0, dilate=0, fitluma=false, blur=0, motpn=false, seg=0) StackVertical(i, last)
Тот же пример с использованием параметров более новой версии 1.0 фильтра (вверху - с размазыванием границ пятен, внизу - с дополнительной временной фильтрацией)
Использованные для примера команды скрипта :
AviSource("film8mm.avi") LoadPlugin("despot.dll") ConvertToYV12() Crop(0,0,720,288) # Сравним кадры с блюром, с и без временным сглаживанием i = last b = DeSpot(i, p1=35, p2=14, pwidth=70, pheight=70, mthres=25, mwidth=20, mheight=15, interlaced=false, \ merode=33, ranked=false, p1percent=0, dilate=0, fitluma=false, blur=4, motpn=false, seg=0) t = DeSpot(i, p1=35, p2=14, pwidth=70, pheight=70, mthres=25, mwidth=20, mheight=15, interlaced=false, \ merode=33, ranked=false, p1percent=0, dilate=0, fitluma=false, blur=4, motpn=false, seg=0, tsmooth=3) StackVertical(b, t)
В новых версиях фильтра введены дополнительные параметры для большей надежности детектирования пятен и их удаления без внесения артефактов.
DeSpot может быть загружен как любой AviSynth плагин, помещением в каталог плагинов или используя LoadPlugin. Клип должен иметь YV12 или специальный планарный YUY2 формат. Базовое использование:
AviSource("d:\video.avi") LoadPlugin("despot.dll") ConvertToYV12() DeSpot(p1=35, p2=14, mthres=25)
Фильтр может работать в двух режимах переключаемых новым параметром median (с версии 2.0):
median (true or false, default = false),
false - режим удаления пятен - фильтр пытается идентифицировать шум и исключить его.
true - медианный режим - будет просто прилагать простой временной медианный
(усредняющий) фильтр к не-движущимся областям образа.
Вызов функции:
DeSpot
(clip, int "mthres", int "mwidth", int "mheight",
int "merode", bool "interlaced", bool "median", int "p1", int "p2", int "pwidth",
int "pheight", bool "ranked", int "sign", int "maxpts", int "p1percent",
int "dilate", bool "fitluma", int "blur", int "tsmooth", int "show", int "mark_v",
bool "show_chroma", bool "motpn", int "seg", bool "color", int "mscene", int "minpts",
clip "extmask", bool "planar")
p1 (default 24)
p2 (default 12)
Пиксел (точка) должен отличаться от соседей (по времени) по крайней мере на величину p1
по яркости, чтобы рассматриваться как шум. Окружающие пикселы должны
отличаться (от соседей по времени) по крайней мере на p2,
чтобы рассматриваться как часть того же пятна, и образуя его окружение.
pwidth (default 6)
pheight (default 5)
Каждое пятно не может быть больше по ширине pwidth и высоте pheight
ranked (true or false, default=true)
Включает режим ранжированной разности по 6 точкам вместо 2.
sign (default 0)
Устанавливает режим для удаления только черных или белых пятен или всех:
sign = 0 - любые пятна и их окружение (как в старой версии)
sign = 1 - только черные (темные) пятна и их темное окружение
sign = -1 - только белые (светлые) пятна и их светлое окружение
sign = 2 - только черные (темные) пятна и их любое окружение
sign = -2 - только белые (светлые) пятна и их любое окружение
maxpts (from 0 to 10000000, default=0 - без ограничений)
Устанавливает верхний предел числа точек в каждом пятне.
minpts (from 0 to 10000000, default=0 - без ограничений)
Устанавливает нижний предел числа точек в каждом пятне.
p1percent (from 0 to 100, default=10)
Устанавливает нижний предел относительной доли контрастных (по критерию P1) точек в каждом пятне.
dilate (from 0 to 255, default=1)
Устанавливает величину морфологического расширения (роста) пятен (в пикселах).
fitluma (true or false, default=true)
Разрешает некоторую коррекцию яркости в месте удаленного пятна
blur (from 0 to 4, default 1)
Величина (протяженность) пространственного смазывания у границ удаленных пятен
tsmooth (from 0 to 127, default 0)
Управляет временным сглаживанием (динамическим шумопонижением) в статических областях (вне пятен и движения).
Устанавливает примерный порог вариации яркости в трех кадрах,
чем больше вариация превышает этот порог, тем меньше временное сглаживание.
0 -нет временного сглаживания.
motpn (true or false, default = true)
Определяет метод детектирования движения.
false - определить движение от предыдущего до текущего и от текущего до
следующего кадра. (старый метод использовавшийся во всех версиях до
3.0).
true -определить движение от предыдущего до следующего кадра (новый метод с версии 3.0)
seg (from 0 to 2, default=2)
Определяет режим удаления сегментов пятен.
0 - удаление только пикселов, которые не перекрываются зонами
движения (старый метод использовавшийся во всех версиях до 3.0,
наиболее сильное удаление);
1 - удаление только таких целых сегментов пятен, которые не имеют перекрытия с зонами движения;
2 - удаление только таких цельных пятен, которые не имеют перекрытия с зонами движения (наиболее безопасное).
color (true of false, default = false)
Управляет коррекцией цвета пятен.
true - изменять цвет пикселов на месте удаляемых пятен на среднее значение предыдущего, текущего и следующего кадров,
false - не менять цвет пикселов на месте удаляемых пятен.
mscene (from 0 to 100, default=40)
Устанавливает процент движущихся пикселов для детектирования смены сцены и отмены удаления пятен на кадре
extmask (по умолчанию нет)
Дополнительный клип с внешней маской. Он будет бинаризован с порогом 127 и логически
добавлен (операцией "ИЛИ")
к внутренней маске движения.
Это может быть использовано для дополнительной защиты хороших объектов (если вы имеете некоторую подходящую маску).
mthres (default 16)
Пиксел должен отличаться от другого кадра по крайней мере на mthres,
чтобы считаться движущимся. Это число должно быть больше чем p2,
чтобы предотвратить идентификацию шума как движения.
mwidth (default 7)
mheight (default 5)
Эти параметры управляют поведением
алгоритма удаления шума и расширения карты движения (путем
морфологического открытия, т.е. эрозии и расширения).
merode (default = 33)
Параметр определяет порог процента движущихся пикселов в блоке на стадии эрозии.
interlaced (true or false)
Трактовать ли видео как
чересстрочное или нет (прогрессивное). По умолчанию - false, т.е.
прогрессивное для DeSpot с версии 1.3. (Более старые версии ошибочно
обрабатывали по умолчанию видео как чересстрочное, если оно было
разделено на поля).
Чтобы вместо фильтрации, показать карту движения и пятна,
которые будут удалены, используйте отладочные параметры:
show (0, 1, 2, default=0)
0 - не показывать,
1 - только
выделить шум вместо его удаления,
2 - показать карту движения и пятна
Если show=1, вы можете использовать дополнительный параметр для изменения цвета выделения:
mark_v (0 to 255, default= 255)
Где mark_v - величина яркости чтобы выделить шум.
Цвет шума (розовый, зеленый или серый) зависит от четности параметра mark_v.
Показывается также карта движения пониженной контрастностью.
Если show=2, при отладке яркость изменяется следующим образом:
255 (белый): Шум, который будет удален
159: Шум, который не будет удален, так как он может быть движением
95: Карта движения для текущего кадра
show_chroma (true or false)
Показать цветовую информацию на карте движения.
bool "planar" : логический флаг использования специального планарного цветового формата для YUY2 клипов
как на входе, так и на выходе функции.
Это использует специальный трюк для хранения кадров с планарной цветовой организацией данных
(отдельные плоскости Y, U, V в памяти) в нормальном чередующемся формате YUY2 кадров как контейнере.
Таким способом мы можем избежать многочисленных внутренних преобразований из чередующегося в планарный формат и увеличить скорость.
Вы можете преобразовать нормальный чередующийся YUY2 исходный клип в планарный формат функцией interleaved2planar
из плагина SSETools пакета RemoveGrain от kassandro,
и преобразовать конечный результат функцией planar2interleaved
.
Этот специальный планарный YUY2 также поддерживается плагином Removegrain от Kassandro,
плагином MaskTools2 от Manao, MVTools v2 и некоторыми другими.
Данный трюк не будет нужен в Avisynth v2.6 с внутренней поддержкой планарного формата YV16.
Данный параметр игнорируется для клипов в формате YV12.
По умолчанию planar=false (и вы получите ошибку для формата YUY2).
Чтобы фильтр работал правильно, различные параметры ДОЛЖНЫ быть установлены. Не существует хороших величин по умолчанию.
Первый параметр, который нужно установить, это interlaced, установите его равным true, если ваше видео чересстрочное, и false в противном случае.
Затем должны быть установлены pwidth и pheight. Установите их слегка большими, чем те пятна, которые вы хотите исключить. Если видео чересстрочное, тогда pheight представляет высоту в отдельном поле. Таким образом, она будет в сущности удвоена.
Затем должны быть установлены p1, p2, и mthres. Вообще, p1 > mthres > p2. Если они установлены слишком малыми, то вы можете потерять детали, так как малая вариация пиксела может быть принята за пятно, и более важно, настоящие пятна могут не распознаться, так как размер того, что фильтр посчитает пятном, может быть больше чем pwidth на pheight. show=1 или 2 могут быть полезны в установлении этих параметров.
Установите параметры mwidth, mheight в соответствии с величиной движения (перемещения) в кадре. Они определяют зоны безопасности (влияния) вокруг движущихся объектов, в которых пятна не удаляются. При слишком малых значениях, часть движущегося объекта может быть принята за пятно, при больших значениях многие пятна не будут удалены. Чтобы снизить влияние малых областей движения, можно увеличить параметр merode (от зависимых значений по умолчанию). Если используется компенсация движения, эти параметры можно уменьшить для более полного удаления пятен.
Затем можно установить sign если почти все пятна на вашем видео имеют выраженный черный или наоборот белый оттенок. Учтите и оттенок окантовки (обрамления) пятен. Правильная настройка параметра может уменьшить число ложных срабатываний фильтра (артефакты).
Я рекомендую использовать новый параметр ranked=true для более устойчивого детектирования пятен на шумном видео.
Используйте параметр maxpts как другой метод в дополнение к размерам pwidth и pheight для избежания очистки слишком больших (по числу точек) объектов - вероятно не пятен.
Используйте параметр p1percent, чтобы не очищать слишком слабые малоконтрастные пятна, с малым относительным числом контрастных точек (по порогу p1).
Для более полного удаления частично поврежденных пикселов на границах не резких пятен, можно расширить пятна (размер очищаемой области) путем увеличения параметра dilate.
Разрешите коррекцию яркости в месте удаленных пятен параметром fitluma.
Эта коррекция является локальной (основанная на сегментах) в режимах seg>0 mode и должна быть использована с правильно подобранным расширением пятен, чтобы предотвратить неверную коррекцию из-за нерезких границ пятен.
Для снижения заметности границ удаленных пятен, настройте их пространственное смазывание параметром blur.
Для уменьшение шума в статичных областях, попытайтесь использовать временное сглаживание, подбирая параметр tsmooth (рекомендую от 4 до 8).
Если пятна имеют некоторый цвет, попробуйте включить параметр color, хотя это может привести и к заметности ложных срабатываний.
Чтобы предотвратить артефакты при смене сцены, уменьшите параметр mscene.
1a) Находит пикселы, которые отличаются от соседей (в соседних кадрах) по крайней мере на p1.
Если параметр sign
не равен 0, учитывается и знак разности.
Если параметр ranked активен (новый метод с версии 1.3), то
три соседа в предыдущем кадре (x-1, x, x+1)
и 3 соседа в следующем кадре ранжируются (упорядочиваются по величине)
, и их минимум и максимум используются для вычисления текущей разницы
(от данного пиксела x).
Если параметр ranked неактивен (false) (старый метод),
только один сосед в предыдущем кадре (в той же позиции x)
и один сосед в следующем кадре используются для вычислений минимума и максимума.
Эти пикселы объединяются в линейные горизонтальные сегменты.
Уложенные вертикально сегменты объединяются в пятна.
1b) Увеличивает окружение исходя из p2<p1.
2a) Определяет размер пятен и отвергает (не будет очищать) те, которые больше чем pwidth x pheight.
Если параметр numpts активен, отвергаются также большие пятна (с большим числом точек).
Если параметр p1percent активен, то отвергаются также не очень сильные (по критерию p1)
пятна, (которые состоят в основном из окружения) (по критерию p2).
2b) Если режим Dilate активен, пятна расширяются на заданную величину, чтобы полностью покрыть малоконтрастные края и закрыть малые промежутки между ними, путем применения операции морфологического расширения к карте шума (пятен).
3a) Находит движущиеся области образа путем простого сравнения
каждого пиксела с другим кадром и рассматривая все, для которых разница
больше чем mthres.
Если motpn=false, рассматривается движение от предыдущего к текущему кадру,
Если motpn=true, рассматривается движение от предыдущего к последующему кадру.
3b) Помечает пикселы, определенные как движение без шума с весом 3 на карте движения.
Если motpn=false, Помечает пикселы, определенные как движение и шум с весом 1 на карте движения.
4) Удаляет шум и малые области из карты движения путем эрозии и затем расширения (итого морфологического открытия).
На стадии эрозии, карта движения эродирует на mwidth/2 и mheight/2,
и зоны с малым суммарным весом (менее чем 3*merode/100)
уменьшаются или полностью удаляются из карты движения. Такие зоны
отвечают малому относительному числу движущихся соседних пикселов в
этом диапазоне (или большинству точек с шумом).
На стадии расширения, оставшиеся зоны движения расширяются на заданный диапазон.
Это вероятно наиболее важные шаги (особенно если motpn=false).
4a) Если процент движущихся пятен больше чем параметр mscene , плагин регистрирует смену сцены, и вся карта движения устанавливается как движущаяся.
4b) Добавляет (опционально) дополнительную внешнюю маску к карте движения.
5) Удаляет только пятна, в которых нет движения (в текущем или следующем кадре если motpn=false).
В режиме удаления пикселов (seg = 0), проверяет и удаляет только пикселы,
которые не перекрываются зонами движения, остальные отвергает.
В режиме удаления сегментов (seg = 1), удаление только таких сегментов пятен,
которые не имеют перекрытия с зонами движения.
В режиме удаления пятен (seg = 2), удаление только таких пятен, которые не имеют перекрытия с зонами
движения (наиболее безопасное, минимум артефактов ложного удаления).
6) Опционально делает коррекцию яркости и пространственное (по строкам) сглаживание границ пятен.
7) Опционально делает временное (динамическое) сглаживание статичных областей.
8) Опционально корректирует цвет на месте пятен.
1) Находит движущиеся области образа просто сравнивая каждый пиксел с предыдущим кадром и рассматривая все, для которых разница больше чем mthres.
2) Удаляет малые области из карты движения путем эрозии и затем расширения (итого морфологического открытия). Это вероятно наиболее важный шаг.
3) Применяет простой временной медианный фильтр к не-движущимся частям образа.
DeSpot с версии 3.2 вручную оптимизирован для Integer SSE (Pentium3, Athlon теперь необходимы).
Увеличение скорости до 30%.
Версии Fizick выше 1.1 компилированы с помощью свободного MS VC++ Toolkit 2003 вместе с MS Platform SDK.
Замечание: скопируйте забытые nmake.exe и cvtres.exe из Bin\win64 каталога в Bin.
Также могут быть использованы MS VC6, VC7.
Используйте Nmake.exe и файл "makefile" командой:
NMAKE
Старые версии C-плагина до 1.3 могли компилироваться с помощью GCC и GNU Make. Версии начиная с 2.0 - не могут.
Сейчас я использую despot.cbp проект для CodeBlock IDE.
Очень хорошие результаты дает использование данного фильтра совместно с оценкой и компенсацией движения в кадрах: глобального движения плагином DePan, или локального движения плагином MVTools.
В этом случае фильтр использует скомпенсированные кадры, получаемые из предыдущего и последующего путем подгонки положения точек к текущему. Следовательно относительное движение уменьшается, ложное детектирование пятен уменьшается, и степень подавления шумов увеличивается.
Пример скрипта с DePan 0.9 (вы можете подстроить дополнительные параметры DePanEstimate):
AviSource("h:\kino.avi") LoadPlugin("depan.dll") LoadPlugin("despot.dll") i = ConvertToYV12() d = DePanEstimate(i, trust=3) DePanInterleave(i, data=d) DeSpot(p1=30, p2=15, pwidth=800, pheight=600, mthres=20, motpn=true, dilate=1, seg=1) SelectEvery(3, 1)
Пример простого скрипта c MVTools версии от 0.95 до 1.X (вы можете подстроить дополнительные параметры MVAnalyse, MVCompensate):
AviSource("h:\kino.avi") LoadPlugin("mvtools.dll") LoadPlugin("despot.dll") i = ConvertToYV12() vf = MVAnalyse(i, isb=false) f = MVCompensate(i, vf) vb = MVAnalyse(i, isb=true) b = MVCompensate(i, vb) Interleave(f, i, b) DeSpot(p1=30, p2=12, mthres=20, dilate=2, fitluma=true, blur=2, seg=2) SelectEvery(3,1)
Пример скрита с внешней маской из плагина MVTools версии 2.3 и выше (вы можете настроить дополнительные параметры MAnalyse):
LoadPlugin("mvtools2.dll") LoadPlugin("mt_masktools-25.dll") LoadPlugin("degrainmedian.dll") LoadPlugin("despot.dll") AviSource("h:\kino.avi") i = ConvertToYV12() prefilt=i.DeGrainMedian() # предварительно фильтрованный клип для лучшего анализа движения # анализируеи и компенсируем движение вперед и назад (к текущему кадру) ml = 100 # масштаб маски thscd1 = 400 # порог смены сцены super=i.MSuper() # super clip superprefilt=prefilt.MSuper() # super фильтрованный клип vf = superprefilt.MAnalyse(isb=false) # вектора вперед cf = i.MFlow(super, vf, thscd1 = thscd1) # предыдущий кадр, компенсированный вперед sadf = i.MMask(vf, ml=ml,kind=1,gamma=1, thscd1 = thscd1) # маска SAD вперед msadf=sadf.MT_Binarize(20,upper=true) # двоичная инвертированная маска SAD вперед vb = superprefilt.MAnalyse(isb=true) # вектора назад cb = i.MFlow(super, vb, thscd1 = thscd1) # следующий кадр, компенсированный назад sadb = i.MMask(vb, ml=ml, gamma=1, kind=1, thscd1 = thscd1) # маска SAD назад msadb = sadb.MT_Binarize(20,upper=true) # двоичная инвертированная маска SAD назад msad = MT_Logic(msadf,msadb,"or") # комбинированная инвертированная маска SAD msad = msad.MT_Expand() # расширенная маска msadi = Interleave(msad, msad, msad) # тройное повторение маски # Эта маска высока (255), где по крайней мере одна из оценок движения хороша, # так что эти области будут защищены # чередуем компенсированный вперед предыдущий, текущий и компенсированный назад следующий кадры Interleave(cf,i,cb) DeSpot(p1=30,p2=12,pwidth=800,pheight=600,mthres=20,merode=33,\ sign=0,show=1,seg=0,color=true,motpn=true, extmask=msadi) SelectEvery(3,1) # получаем отфильтрованный источник
Обсуждение фильтров ConditionalTemporalMedian и Despot на англоязычном форуме: http://forum.doom9.org/showthread.php?s=&threadid=59388
Данная программа представляет собой свободно распространяемый
программный продукт; вы можете распространять ее далее и\или изменять
на условиях Стандартной публичной лицензии GNU, опубликованной
"Free Software Foundation" -- либо ее версии номер 2, либо (по вашему
выбору) любой более поздней ее версии.
Распространяя данный программный продукт, мы надеемся что он окажется
полезным, но НЕ ДАЕМ НИКАКИХ ГАРАНТИЙ, даже подразумеваемой гарантии
ПРИГОДНОСТИ К КУПЛЕ-ПРОДАЖЕ или ИСПОЛЬЗОВАНИЮ В КОНКРЕТНЫХ ЦЕЛЯХ
(см. "Стандартную публичную лицензию GNU").
(Суть: Вы можете модифицировать и программу и ее исходный код,
но все модификации должны распространяться на таких же условиях, с исходными кодами, свободно).
Прошу рассмотреть возможность финансовой поддержки, чтобы быть зарегистрированным пользователем.