Плагин для Avisynth 2.5
Версия 0.8.2
Авторские права (C)2004-2006 Александр Г. Балахнин (aka Fizick).
http://avisynth.org.ru
DeGrainMedian плагин разработан главным образом для удаления зернистости пленок, но может быть использован для общего понижения шума.
Он использует некоторый пространственно-временной ограниченно медианный метод.
DeGrainMedian
(clip, int
"limitY", int "limitUV", int "mode", bool "interlaced")
первый параметр как всегда входной клип, по умолчанию последний (last),
limitY (от 0 до 255, по умолчанию=4) - предел коррекция яркости пиксела,
limitUV (от 0 до 255, по умолчанию=6) - предел коррекции цвета пиксела
mode (от 0 до 5, по умолчанию=1) - режим обработки (чем больше, тем слабее)
interlaced
(true или false, по умолчанию=false) - обрабатывать клип как
чересстрочный
norow (true или false, по умолчанию=false) - не использовать ту же строку для пространстственного фильтра
Загрузите плагин, настройте величины параметров подходящие для вашего клипа.
Установите значение параметра limitY типично около 2-8 (компромисс между удалением шума и размыванием).
Кажется, что большие значения параметра limitUV для цвета (4-15) часто вполне безопасны.
Установите параметр выбора режима mode в большую величину если вы находите картинку слишком размытой (попробуйте!).
Чем больше номер режима mode, тем большее значение параметров пределов limit безопасны.
Кажется, что режим mode=1 или 2 - хороший компромисс, но это зависит от источника.
С режимом mode=5 изменения результата невидимы, но некоторые "горячие" пикселы все же удаляются.
Опция norow=true полезна для видео с горизотальными шумовыми полосами, такими как аналоговый ТВ или VHS захват.
Avisource("dvd-input.avi") loadplugin("DeGrainMedian.dll") DeGrainMedian(limitY=5,limitUV=5,mode=3)
Avisource("input.avi") loadplugin("DeGrainMedian.dll") DeGrainMedian(limitY=2,limitUV=3,mode=1) DeGrainMedian(limitY=2,limitUV=3,mode=1)
Avisource("analog-input.avi") loadplugin("DeGrainMedian.dll") DeGrainMedian(limitY=5,limitUV=7,mode=0)
Avisource("analog-input.avi") loadplugin("DeGrainMedian.dll") DeGrainMedian(limitY=5,limitUV=7,mode=1, norow=true)
Плагин базируется в основном на двух идеях, используемых на двух стадиях обработки.
Первая идея
взята из плагина STMedianFilter
от Тома Барри
(Tom Barry). Я также использую часть
его замечательно оптимизированного кода и привожу здесь часть
прекрасной документации (немного отредактированной
и коряво переведенной на русский, как и другие цитаты) :
"STMedianFilter это (слегка скомпенсированный
по движению) пространственно/временной медианный фильтр.
Он довольно тонкозернистый, используя только соседние пикселы в
пространстве и во времени, так что он смотрит смежные 26 позиций чтобы
фильтровать каждую позицию. Он фильтрует как яркость, так и цветность...
...Простой медианный фильтр это просто шаг обрезки,
когда величина устанавливается, чтобы не превышать верхний и нижний
пороги ее соседей. (вероятно более строго: медиана есть средний
член ранжированного (упорядоченного по величине) ряда - Fizick).
Например, если вы имеете 3 пиксела в строке, которые
имеют величины <5,8,7>, то вы могли бы обрезать
центральную
величину до не выходящей из пределов снизу 5 или сверху 7, то есть вы
установили бы ее равной 7.
Теперь представьте что вы имели бы небольшой видео
экран 3x3, подобно поверхности кубика Рубика. Представьте предыдущий
кадр был бы нижним слоем кубика, текущий кадр был бы средним слоем, и
следующий кадр был бы верхним.
Тогда текущий центральный пиксел был бы в центре
кубика Рубика и было бы 13 путей (способов) как вы могли бы
провести линию через него и пару ближайших соседей.
Что я (и я - Fizick) делал бы было сравнить
каждую из этих пар соседей чтобы увидеть какая пара наиболее
согласуется по величине. Я (и я - Fizick)
использовал эту пару,
чтобы обрезать величину центрально пиксела." (Конец цитаты Tom
Barry).
Очень интересный плагин RemoveGrain
от Kassandro
в его режиме mode=9 работает подобно STMedianFilter
на этой стадии но в только в пространственной плоскости
(не во временной).
Он затем изменяет пиксел в это значение соседей (методом минимакса).
Но он не может удалить зернистость среднего размера с моих
плохих пленок.
RemoveGrain
рассматривается Kassandro как
префильтр для плагина
RemoveDirt
, он говорит в документации:
"Если зерно слишком грубое, RemoveGrain может только частично удалить
его или не может удалить его вовсе."
( Конец цитаты Kassandro)
Кажется, что это главным образом из-за отсутствия пространственной
информации от соседних кадров.
С версии 0.2, я добавил к DeGrainMedian также некоторые другие более безопасные режимы обработки 1-4 (позднее 5) (код заимствован из RemoveGrain).
Мы рассматриваем тот же куб 3x3x3.
Новое значение пиксела-кандидата (newp) обрезается величинами соседей
из пары (bound1 и bound2).
Однако mode1-mode4 используют более безопасные критерии (веса) оптимальной
пары пикселов,
Мы также учитываем разность новой величины
от старой величины центрального пиксела (oldp).
Mode=0 плагина
DeGrainMedian (подобно mode=9 RemoveGrain) использует
вес=|bound1 - bound2|, это сильнейший режим.
Mode=1 плагина
DeGrainMedian (сильнее mode=8 RemoveGrain) использует
вес=|oldp - newp|+4* |bound1 - bound2|
Mode=2 плагина
DeGrainMedian (подобно mode=8 RemoveGrain) использует
вес=|oldp - newp|+2* |bound1 - bound2|
Mode=3 плагина
DeGrainMedian (подобно mode=7 RemoveGrain) использует
вес=|oldp - newp|+ |bound1 - bound2|
Mode=4 плагина
DeGrainMedian (подобно mode=6 RemoveGrain) использует
вес=2*|oldp- newp|+ |bound1 - bound2|
Mode=5 плагина
DeGrainMedian (подобно mode=5 RemoveGrain) использует
вес=|oldp - newp|, это слабейший (и безопасный) режим.
Опция norow исключает горизонтальную пару пикселов того же кадра из рассмотрения, и фильтр учитывает только 12 пар.
STMedianFilter
на второй стадии не фильтрует пиксел, если тот изменился бы более чем
на некоторое пороговое значение.
(Более точно, он сначала делает временное детектирование медианы и
пороговую проверку, с последующим пространственным
детектированием медианы и пороговой проверкой)
Большинство шумоподавителей также не фильтруют
пикселы с большим шумом
(большой разностью яркостей).
Но как такие одиночные пикселы очень заметны на плоский сглаженный
областях,
так и группы таких пикселов формируют очень неприятные краевые
артефакты.
Кроме того, чисто темпоральные (временные, динамические) шумоподавители часто производят призраки даже при не очень больших порогах.
DeGrainMedian на этой второй стадии использует другой (отличный) метод обработки пикселов.
Здесь я использую вторую идею,
заимствованную из плагина Dust
от Steady.
Смотри часть документации
Dust
здесь:
"Limit=5
Устанавливает силу временной фильтрации.
(насколько много он может изменить оригинальный
пиксел)." (Конец цитаты Steady).
Таким образом, если фильтрованный пиксел изменился
бы более чем на некоторый порог (предел, ограничение), то он НЕ будет
восстановлен в DeGrainMedian к оригинальной величине, а будет изменен,
но на ОГРАНИЧЕННУЮ величину.
DeGrainMedian плагин фильтрует
ВСЕ пикселы, но с ограниченной силой.
Следовательно, все
зерна и царапины будут (частично или полностью) сглажены.
Фильтр почти не производит краевых артефактов.
Призраки также минимальны, так ка фильтр автоматически переключается к пространственному сглаживанию, как наиболее близкой паре соседей по величине.
Вы можете выбрать один из 6 режимов обработки, от сильной (но сглаживающей) до слабой (но резкой).
Таким образом, DeGrainMedian
имеет скорость STMedianFilter
(правда) и
силу Dust
(правда по ограниченной величине :-)!
Это почти не шутка :-).
Он может сильно увеличичить сжимаемость.
Что же плохо, в самом деле?
Серьезно,
это не супер фильтр и еще экспериментальный, но для моих зернистых
пленок, он производит вполне хорошие результаты.
Сначала я
разрабатывал его как префильтр (для Vaguedenoiser и т.п.), но
кажется теперь, что иногда он может быть использован самостоятельно...
Возможно, он может помочь кому-нибудь еще. Вот почему я выпускаю его.
Некоторое
замечание. При limitY=255,
DeGrainMedian
должен давать тот же (или
подобный) выход,
как STMedianFilter
с порогами=255 (и с теми
же артефактами),
но это не так сейчас,
возможно из-за некоторой ошибки или ошибок :-(
Исправление:
Это правда теперь - была ошибка в STMedianFilter , и я исправил ее в
версии 1.0.3.
Он должен быть применен до других шумоподавляющих фильтров.
Иногда я использую в скрипте два DegrainMedian c пониженными пределами чтобы повысить степень удаления шума.
Лучшие результаты для реставрации пленок с Avisynth могут быть достигнуты с моим плагином компенсацией глобального движения DePan.
Смотри форум doom9, специальная ветка (на английском):
http://forum.doom9.org/showthread.php?s=&threadid=80834
Я использую свободный MS VC++ Toolkit 2003 и MS Platform SDK.
Используйте make файл проекта "makefile" с командой:
nmake
(замечание: скопируйте потерянный nmake.exe и cvtres.exe из Platform SDK папки Bin\win64 в папку Bin ).
Данная программа представляет собой свободно распространяемый
программный продукт; вы можете распространять ее далее и\или изменять
на условиях Стандартной публичной лицензии GNU, опубликованной
"Free Software Foundation" -- либо ее версии номер 2, либо (по вашему
выбору) любой более поздней ее версии.
Распространяя данный программный продукт, мы надеемся что он окажется
полезным, но НЕ ДАЕМ НИКАКИХ ГАРАНТИЙ, даже подразумеваемой гарантии
ПРИГОДНОСТИ К КУПЛЕ-ПРОДАЖЕ или ИСПОЛЬЗОВАНИЮ В КОНКРЕТНЫХ ЦЕЛЯХ
(см. "Стандартную публичную лицензию GNU").
Вместе с данной программой вы должны были получить копию "Стандартной
публичной лицензии GNU"; если это не так, напишите в Free Software
Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA.
(Суть: Вы можете модифицировать и программу и ее исходный код,
но все модификации должны распространяться на таких же условиях, с
исходными кодами, свободно).
С благодарностью приму некоторую финансовую поддержку.