DeGrainMedian плагин для AviSynth

# DeGrainMedian

## Пространственно-временной ограниченно медианный фильтр для удаления зерна

Плагин для Avisynth 2.5
Версия 0.8 - 9 октября 2005 г.
Авторские права (C)2004-2005 Александр Г. Балахнин (aka Fizick).
http://bag.hotmail.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` (правда по ограниченной величине :-)!
Это почти не шутка :-).

Он может сильно увеличичить сжимаемость.

Что же плохо, в самом деле?

1. Некоторое размытие (вы хотели шумопонижение без этого ? :-) .
2. Он не может произвести полностью гладкую картинку, некоторый шум всегда остается (вы любите сверх сглаженные и блочные сжатые клипы ?) .
3. Компенсация движения ограничена диапазоном 1 пиксел (конечно, это НЕ как Dust, но что о внешней компенсации движения ?).

Серьезно, это не супер фильтр и еще экспериментальный, но для моих зернистых пленок, он производит вполне хорошие результаты.
Сначала я разрабатывал его как префильтр (для Vaguedenoiser и т.п.), но кажется теперь, что иногда он может быть использован самостоятельно...

Возможно, он может помочь кому-нибудь еще. Вот почему я выпускаю его.

Некоторое замечание. При limitY=255, `DeGrainMedian` должен давать тот же (или подобный) выход,
как `STMedianFilter` с порогами=255 (и с теми же артефактами), но это не так сейчас,
возможно из-за некоторой ошибки или ошибок :-(
Исправление: Это правда теперь - была ошибка в STMedianFilter , и я исправил ее в версии 1.0.3.

## Совместное использование

Он должен быть применен до других шумоподавляющих фильтров.

Иногда я использую в скрипте два DegrainMedian c пониженными пределами чтобы повысить степень удаления шума.

Лучшие результаты для реставрации пленок с Avisynth могут быть достигнуты с моим плагином компенсацией глобального движения DePan.

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

Работает только в цветовых форматах YV12 и YUY2.

1. Требует процессор P-III, Athlon, или лучше. Требуется поддержка SSEMMX (Integer SSE).
2. Нет детектора изменения сцены. Но я не вижу призраков, так как фильтр переключается на пространственную пару пикселов.
3. Первая и последняя строки (пары строк для чересстрочного) каждого кадра не фильтруются.
4. Первые и последние 8 (YV12) или 4 (YUY2) пиксела в каждой строке фильтруются с более простым (в той же колонке) методом.
5. Фильтрация цветности для YUY2 также только по той же колонке.
6. Первый и последний кадр не фильтруется.
7. Тестирован с Avisynth 2.5.5.
8. Очень быстрый.

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

Смотри форум doom9, специальная ветка (на английском):
http://forum.doom9.org/showthread.php?s=&threadid=80834

Или обращайтесь на русскоязычный форум, например ветка "Экстремальный Ависинт" http://forum.ixbt.com/topic.cgi?id=29:9331

## Компиляция

Я использую свободный 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.
(Суть: Вы можете модифицировать и программу и ее исходный код,
но все модификации должны распространяться на таких же условиях, с исходными кодами, свободно).

С благодарностью приму некоторую финансовую поддержку.

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

- Версия 0.1, 13 августа 2004 - первая публичная (бета!).
- Версия 0.1.1, 18 августа 2004 - исправлена ошибка с пространственной частью YV12 (дистанция была 2 пиксела)
- Версия 0.2, 21 августа 2004 - Добавлены более безопасные режимы modes=1-4, обновлена документация
- Версия 0.3, 28 августа 2004 - добавлена чересстрочная обработка, реорганизация кода
- Версия 0.4, 10 сентября 2004 - исправлена возможная ошибка с разными питчами кадров
- Версия 0.5, 23 марта 2005 - использовано более корректное кэширование. Благодарность Turyst04 за доклад о проблеме стабильности.
- Версия 0.6, 2 апреля 2005 - исправлена некоторая ошибка с YUY2. Благодарность AVIL за доклад.
- Версия 0.7, 21 апреля 2005 - исправлена ошибка в режиме mode=2 для YV12 чересстрочном; исправлен питч первого кадра.
- Версия 0.7.0, 27 июля 2005 - только переформатирована документация
- Версия 0.8, 9 октября 2005 - изменен диапазон кэша кадров до 3;
  - добавлена опция norow чотобы отменить использования пары из той же строки кадра;
  - исправлена ошибка документации о режиме mode=1;
  - переименованы режимы 4 в 5, 3 в 4, 2 в 3, добавлен новый режим 2.

### Download DeGrainMedian version 0.7.0

### Download DeGrainMedian version 0.8

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