DeSpot - Условный временной удаляющий пятна фильтр
С-plugin для Avisynth 2.5

Версия 1.0 от 30 декабря 2003 г.
Copyright (c)2003 Александр Г. Балахнин aka Fizick
http://bag.hotmail.ru

Основан на условном временном медианном фильтре ConditionalTemporalMedian,
версии 0.93 September 27, 2003

Copyright (C) 2003 Kevin Atkinson (kevin.med@atkinson.dhs.org) under the GNU GPL version 2.
http://kevin.atkinson.dhs.org/temporal_median/
 

Я переименовал мою новую версию фильтра в более соответствующее название DeSpot,

и добавил некоторые функции, конечно :-).


Данный фильтр разработан для удаления временного шума в форме малых точек
и полосок, имеющихся в некоторых видео. Общая причина этого есть грязные
видеоголовки VHS, но мы также бывают малые черные или
белые точки в транслируемых телепередачах.
Фильтр полезен для удаления случайных помех в виде темных пятен от пыли

 и полос от некоторых царапин на оцифрованных кинопленках.

 


Примеры работы фильтра

 

Использованный Avisynth скрипт-файл с использование команд базовой версии.

Avisource("film8mm.avi")
loadplugin("avisynth_c.dll")
loadCplugin("despot.dll")
converttoYV12()
crop(0,0,720,288)
# Compare half-frames with and without noise reduction
StackVertical(last,last.DeSpot(p1=35,p2=14,pwidth=70,pheight=70,mthres=25,mwidth=20,mheight=15,mp=100,interlaced=false))
converttoYUY2()

 

Пример полукадра старой 8мм кинопленки (вверху - до фильтра, внизу - после действия фильтра):

Тот же пример с использованием команд новой версии фильтра

(вверху - с размазыванием границ пятен, внизу - с дополнительной временной фильтрацией)

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

Avisource("film8mm.avi")
loadplugin("avisynth_c.dll")
loadCplugin("despot.dll")
converttoYV12()
crop(0,0,720,288)
# Compare frames with blur, and with and without temporal noise reduction
StackVertical(last.despot(p1=35,p2=14,pwidth=70,pheight=70,mthres=25,mwidth=20,mheight=15,mp=100,interlaced=false,blur=4),
last.despot(p1=35,p2=14,pwidth=70,pheight=70,mthres=25,mwidth=20,mheight=15,mp=100,interlaced=false,blur=4,tsmooth=5))
converttoYUY2()

Подробности о фильтре

 ИСПОЛЬЗОВАНИЕ
 

Фильтр нуждается в Avisynth 2.5 и Avisynth C API plugin версии 0.14 и выше

(c)2003, Kevin Atkinson. Требуемая avithynth_c.dll Avisynth С-интерфейса включена в пакет.

Полная версия может быть найдена на сайте

http://kevin.atkinson.dhs.org

После того, как загружен AviSynth C Plugin avisynth_c.dll
(путем помещения в Plugin каталог или используя LoadPlugin("avisynth_c.dll"),
фильтр необходимо загрузить используя команду LoadCPlugin
(с возможным указанием пути к фильтру):
LoadCPlugin("
despot.dll").

С новым Avisynth 2.53 не требуется avithynth_c.dll, т.к. С-интерфейс включен в ядро,

и C-плагины могут вызываться как обычные:

LoadPlugin("despot.dll")
 

Базовое использование:
DeSpot(clip, <параметры>) или
DeSpotMedian(clip, <параметры>)

(Угловые скобки естественно не пишите...)

Входной видеоклип ДОЛЖЕН быть системы цвета YV12.

DeSpot будет пытаться идентифицировать шум и исключить его,
а DeSpotMedian будет просто прилагать простой временой медианный
(усредняющий) фильтр к не-движущимся областям образа.

Параметры для DeSpot являются любыми из следующих:

p1 (по умолчанию 24)
p2 (по умолчанию 12)
Пиксел (точка) должен отличаться от соседей (по времени) по крайней
мере на величину 'P1' по яркости, чтобы рассматриваться как шум.
Окружающие пикселы должны отличаться (от соседей по времени)
по крайней мере на 'P2', чтобы рассматриваться как часть того же пятна,
и образуя его окружение.

pwidth (по умолчанию 16)
pheight (по умолчанию 5)
Каждое пятно не может быть больше по ширине PWIDTH и по высоте PHEIGHT

sign (по умолчанию 0)
Устанавливает режим для удаления только черных или белых пятен или всех:
sign=0 - любые пятна и их окружение (как в старой версии)
sign=1 - только черные (темные) пятна и их темное окружение
sign=2 - тоько белые (светлые) пятна и их светлое окружение
sign=3 - только черные (темные) пятна и их любое окружение
sign=4 - только белые (светлые) пятна и их любое окружение

fi
tluma (true или false, по умолчанию false)
Разрешает некоторую коррекцию яркости в месте удаленного пятна

blur (от 0 до 4, по умолчанию 0)
Величина (протяженность) пространственного смазывания у границ удаленных пятен
 

tsmooth (от 0 до 127, по умолчанию 0)
Управляет временным сглаживанием (шумопонижением) в статических областях (вне пятен и движения).
Устанавливает примерный порог вариации яркости в трех кадрах,
чем больше вариация превышает этот порог, тем меньше временное сглаживание.
0 -нет временного сглаживания.


Параметры общие для DeSpot и DeSpotMedian:

mthres (по умолчанию 16)
Пиксел должен отличаться от предыдущего кадра по крайней мере на 'MTHRES',
чтобы рассматриваемым движущимся. Это число должно быть больше чем 'P2',
чтобы предотвратить идентификацию шума как движения.

mwidth (по умолчанию 7)
mheight (по умолчанию 5)
mp (по умолчанию mwidth*mheight/3)
Эти параметры управляют поведением карты движения алгоритма шумопонижения.
Судя по всему, mwidth и mheight определяют величины
изменения карты движения (путем
морфологического открытия, т.е. эрозии и расширения),
в которой происходит шумопонижение. Параметр MP ограничивает число пикселов
в области распространения движения.

interlaced (true или false)
Трактовать ли видео как чересстрочное или нет. Поведение по умолчанию
зависит от того, считает ли Ависинт что видео состоит из полей
(то есть чересстрочное) или из кадров (прогрессивное).

Чтобы вместо фильтрации, показать карту движения и шум, который будет удален,
используйте отладочные функции:
DeSpotMap(clip, <параметры>, [show_chroma = false])
DeSpotMedian
Map(clip, <параметры>, [show_chroma = false])

При отладке яркость изменяется следующим образом:
255 (белый): Шум, который будет удален
159: Шум, который не будет удален, так как он может быть движением
95: Карта движения для текущего кадра
63: Карта движения для следующего кадра

Чтобы только выделить шум вместо его удаления используйте:
DeSpotMark(clip, <параметры>, [mark_v = 255])

где mark_v - величина яркости чтобы выделить шум.

НАСТРОЙКА ПАРАМЕТРОВ

Чтобы фильтр работал правильно, различные параметры ДОЛЖНЫ быть установлены
правильно. Не существует хороших величин по умолчанию.

Первый параметр, который нужно установить, это interlaced, установите его
равным true
, если ваше видео черезстрочное, и false в противном случае
(прогрессивное например после деинтерлейса).

Затем должны быть установлены pwidth и pheight. Установите их слегка большими,
чем те пятна, которые вы хотите исключить. Если видео чересстрочное,
тогда pheight представляет высоту в отдельном поле.
Таким образом, она будет в сущности удвоена.

Затем должны быть установлены p1, p2, and mthres. Вообще, p1 > mthres > p2.
Если они установлены слишком малыми, то вы можете потерять детали,
так как малая вариация пиксела может быть принята за пятно, и более важно,
настоящие пятна могут не распознаться так как размер того, что фильтр
посчитает пятном, может быть больше чем pwidth и pheight.
Использование DeSpotMark и DeSpotMap может быть
полезно при настройке параметров.

Затем можно установить sign, если почти все пятна на вашем видео имеют
выраженный черный или наоборот белый оттенок. Учтите и оттенок окантовки
(обрамления) пятен. Правильная настройка параметра может уменьшить число
ложных срабатываний фильтра (артефакты).

Если есть некоторая разнояркость кадров (мерцание кинофильмов), и яркость
в месте удаленных пятен отлична от фона, попробуйте включить коррекцию
параметром fi
tluma (хотя лучше устранить мерцание до фильтра)

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

Для уменьшение шума в статичных областях, попытайтесь использовать

временное сглаживание, подбирая tsmooth (рекомендую от 4 до 8).


КАК ОН РАБОТАЕТ

Фильтр в режиме Denoise работает следующим образом:

1) Находит пикселы, которые отличаются от соседей (в соседних кадрах)
по крайней мере на P1.
(Если параметр sign не равен 0, учитывается и знак разности.)

1b) Увеличивает окружение исходя из P2.

2) Определяет размер пятен и отвергает те, которые больше чем PWIDTHxPHEIGHT

3) Находит движущиеся области образа путем простого сравнения каждого
пиксела с предыдущим кадром и рассматривая все, для которых разница больше
чем MTHRES.

3b) Удаляет пикселы, определенные как шум, из карты движения.

4) Шумопонижает карту движения путем эрозии и затем расширения
(итого морфологического открытия).Это вероятно наиболее важный шаг.

5) Удаляет только пятна, в которых нет движения в текущем или следующем кадре.
 

6) Опционально пространственно (по строкам) сглаживает границы пятен.

 

7) Опционально делает временное сглаживание статичных областей

  (фильтр Винера).

Фильтр в режиме Median работает следующим образом:

1) Находит движущиеся области образа просто сравнивая каждый пиксел с
предыдущим кадром и рассматривая все, для которых разница больше чем MTHRES.

2) Шумопонижает карту движения путем эрозии и затем расширения
(итого морфологического открытия). Это вероятно наиболее важный шаг.

3) Применяет простой временной медианный фильтр к не-движущимся частям образа.


ЗАМЕЧАНИЯ ПО ОПТИМИЗАЦИИ
 

Версия от Fizick не использует оптимизацию.

Базовая версия оптимизирована для ISSE.

Компиляторы плохо оптимизируют MMX и SSE.
Ручная оптимизация могла бы быть выгодна.


КОМПИЛЯЦИЯ


Чтобы компилировать этот фильтр вы должны установит GCC и возможно  GNU Make.

Я использовал GCC-g++ 3.3.1 в среде MinGW 3.0.0-1 с  MSYS 1.09.

Все эти утилиты могут быть найдены на http://www.mingw.org/download.shtml.
Когда все нужные средства установлены, просто наберите в оболочке MSYS:


make

СОВМЕСТНОЕ ИСПОЛЬЗОВАНИЕ

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


ЛИЦЕНЗИЯ

Данная программа представляет собой свободно распространяемый
программный продукт; вы можете распространять ее далее и\или изменять
на условиях Стандартной публичной лицензии GNU, опубликованной
"Free Software Foundation" -- либо ее версии номер 2, либо (по вашему
выбору) любой более поздней ее версии.
Распространяя данный программный продукт, мы надеемся что он окажется
полезным, но НЕ ДАЕМ НИКАКИХ ГАРАНТИЙ, даже подразумеваемой гарантии
ПРИГОДНОСТИ К КУПЛЕ-ПРОДАЖЕ или ИСПОЛЬЗОВАНИЮ В КОНКРЕТНЫХ ЦЕЛЯХ
(см. "Стандартную публичную лицензию GNU").
Вместе с данной программой вы должны были получить копию "Стандартной
публичной лицензии GNU"; если это не так, напишите в Free Software
Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA.

(Суть: Вы можете модифицировать и программу и ее исходный код,
но все модификации с кодами должны распространяться на таких же условиях, свободно.

И не будет пиратства).

СПИСОК ИЗМЕНЕНИЙ ВЕРСИЙ И ЗАГРУЗКА ПРОГРАММЫ

Отличия 1.0 от 0.934 (Dec 30, 2003)
Добавлен параметр "tsmooth" для временного сглаживания в статичных областях.

Изменено имя фильтра на DeSpot, имя файла на despot.dll,
и имена функций:
ConditionalDenoise на DeSpot,
ConditionalDenoiseMark на DeSpotMark,
ConditionalDenoiseMap на DeSpotMap,
ConditionalMedian на DeSpotMedian,
ConditionalMedianMap на DeSpotMedianMap.

Подправлено описание.
(Fizick)

Download DeSpot version 1.0 with source 

Отличия 0.934 от 0.93c (Dec 20, 2003)
Добавлены параметры "fitluma", "blur" для снижения заметности мест удаленных пятен.
Удален параметр "per", ранее использовавшийся для этого.
Изменено значение по умолчанию параметра MP.
Подправлено описание.
(Fizick)

Отличия 0.93с от 0.93b (Nov 30, 2003)
Изменено имя файла на более короткое ctmedian.dll
Добавлен ресурс с информаций о версии файла фильтра.
(Fizick)

Отличия 0.93b от 0.93a (Nov 13, 2003)
Добавлен параметр "per" степени усреднения на границах пятен.
(Fizick, не публичная)

Отличия 0.93a от 0.93 (Nov 7, 2003)
Добавлен параметр "sign" для удаления только черных или белых пятен.
При этом изменена и только iSSE-неоптимизированная часть кода.
Исключена iSSE - оптимизированная версия
Оставлена только общая версия, скомпилированная для ММХ
(Fizick, не публичная)

Changed from 0.92 (Sep 27, 2003)
Fix another nasty bug.
Included non optimized version.
Expanded the manual a bit
(Kevin Atkinson)

Changes from 0.91 (Sep 10, 2003)
Fixed nasty bug.
(Kevin Atkinson)
 

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