FFT3DFilter

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

автор: Alexander G. Balakhnin aka Fizick
версия: 1.9.1
закачка: http://bag.hotmail.ru/
категория: Пространственно-временные сглаживатели
требования: YV12 или YUY2 цветовые форматы
лицензия: GPL

Введение

FFT3DFilter - частотный 3D фильтр для сильного понижения шума и умеренного повышения резкости.

Техническая информация

     FFT3DFilter использует метод быстрого дискретного преобразования Фурье (БПФ, FFT) для обработки видео изображений в частотной области. Он основан на некоторых продвинутых математических алгоритмах оптимальной фильтрации. Он работает не локально, но делает некоторую делокализованную (блочную) обработку. В режиме 3D, это приводит к эффекту подобному частичной компенсации движения. Данный фильтр может уменьшить шум без видимой потери качества и артефактов, даже с вполне сильными настройками. Он может значительно улучшить сжимаемость и снизить размер закодированного файла.
Также он имеет опцию ограниченного повышения резкости как без усиления шума, так и без ее чрезмерного повышения (образования ореолов).
Вымысел? Попробуй его сам! :)

Итак, это пространственно-временной (3D) фильтр, работающий следующим образом:

  1. получаем текущий и некоторые предыдущие кадры;
  2. разделяем каждый кадр на малые перекрывающиеся блоки;
  3. вычисляем частотный спектр путем оконного прямого двумерного (2D) преобразования Фурье каждого блока этих кадров;
  4. делаем некоторую фильтрацию слабых компонент частотного спектра;
  5. опционально повышаем резкость изображения (в двумерной частотной области) путем усиления некоторых частот;
  6. вычисляем обратное 2D преобразование фурье очищенного спектра для каждого блока;
  7. делаем оконное суммирование очищенных перекрывающихся блоков в результирующий выходной кадр.

Перекрывающиеся блоки и взвешивающие окна использованы для предотвращения блочности изображения (и снижения "звона").
Блоки перекрываются на некоторую величину вдоль их вертикального и горизонтального размеров.
Чем меньше перекрытие, тем выше скорость обработки, но с более видимыми артефактами в виде сетки по границам.

Принцип перекрытия показан на картинке.

overlap

Использованы некоторые взвешивающие окна анализа и синтеза, чтобы получить эффективный коэффициент передачи =1 после суммирования блоков.

Плагин имеет несколько режимов обработки на стадии фильтрации спектра:

Использование структуры (образца) шума

С версии 1.5 ввведена возможность выявления структуры (образца) шума путем определения его спектра в некотором пустом блоке (без объектов), и затем подавления шума в соответствии с этой структурой во всем кадре и во всем клипе. Это может быть полезно для подавления гранулярности фильмов (особенно любительских 8 мм) и регулярных помех аналогового ТВ.

Повышение резкости

На стадии повышения резкости (после шумопонижения), плагин усиливает высокие (пространственные, 2D) частоты спектра.
Также есть режим повышенияе резкости без шумопонижения (bt=-1).
С версии 1.1, используется некоторый специальный метод ограниченного повышения резкости :

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

С версии 1.7, для повышения резкости используется фильтр высоких частот Гаусса с переменной частотой среза.

С версии v.1.9, плагин имеет специальный параметр dehalo для снижения сильных частот, это может быть использовано для пространственного адаптивного смягчения изображений с чрезмерно повышенной резкостью (удаления ореолов). Этот режим быть скомбинирован с понижением шума и повышением резкости.

Синтаксис

FFT3DFilter(clip, float "sigma", float "beta", int "plane", int "bw", int "bh", int "bt", int "ow", int "oh", float "ratio", float "sharpen", float "scutoff", float "svr", float "smin", float "smax", bool "measure", bool "interlaced", int "wintype", int "pframe", int "px", int "py", bool "pshow", float "pcutoff", float "pfactor", float "sigma2", float "sigma3", float "sigma4", float "degrid", float "dehalo", float "hr", float "ht" )

Все параметры - именованные.

Параметры функции:

первый параметр - входной клип.

sigma - заданная величина шума для всех (или наивысших) частот (реальное>0, по умолчанию=2.0)
beta - граница шума (реальное>=1.0, по умолчанию=1.0 без остатка шума):
    управляет количеством остающегося шума после применения фильтра Винера, максимальное подавления шума = (beta-1)/beta
plane - обрабатываемый цветовой канал: 0 - яркость Y, 1 - цветоразность U, 2 - цветоразность V (по умолчанию = 0)
bw - ширина блока (целое четное, по умолчанию = 48 с версии 1.2)
bh - высота блока (целое четное, по умолчанию = 48 с версии 1.2)
bt - временной размер блока, число кадров (-1, 0, 1, 2 или 3, по умолчанию = 3):
    0 - все предыдущие кадры (включает режим фильтра Кальмана);
    1 - только текущий кадр (пространственный 2D фильтр Винера);
    2 - предыдущий и текущий кадры (3D фильтр Винера);
    3 - предыдущий, текущий и следующий кадры (3D фильтр Винера))
    4 - два предыдущих, текущий и следующий кадры (3D фильтр Винера))
    -1 - только повышение резкости (2D);
ow - ширина перекрытия (по умолчанию=bw/3 с версии 1.2)
oh - высота перекрытия (по умолчанию=bh/3 с версии 1.2)
kratio - отношение порога к sigma для сброса (переиницилизации) фильтра Кальмана (по умолчанию = 2.0):
    порог вариации = sigma*kratio, хорошие значения от 1.5 до 3.0;
sharpen - степень повышения резкости (по умолчанию=0 - без повышения)
    хорошие значения от 0.3 до 1.0 (отрицательные величины приводят к обратному эффекту)
scutoff - частота среза для повышения резкости, относительно максимальной (по умолчанию =0.3)
svr- отношение вертикального повышения резкости к горизонтальному (по умолчанию=1.0 - равно горизонтальному, 0 - без вертикального)
smin - нижний предел (приблизительная граница шума) для стадии повышения резкости (по умолчанию=4.0)
smax - верхний предел (приблизительная граница чрезмерной резкости) для стадии повышения резкости (по умолчанию=20.0)
measure - выбрать наиболее оптимальный (быстрейший) метод БПФ путем измерения скорости (с некоторой стартовой задержкой) вместо простой оценки (по умолчанию=true с версии 0.9.2)
interlaced - раздельная обработка полей чересстрочного клипа (по умолчанию=false)
wintype - тип взвешивающих окон (по умолчанию=0 снова с версии 1.8):
    0 - одинаковые окна анализа и синтеза типа полу-косинуса, использовались во всех версиях до 1.4;
    1 - промежуточный между 0 и 2;
    2 - плоское окно анализа, окно синтеза типа приподнятуго косинуса (Hanning).
pframe - номер кадра с образцом структуры шума (по умолчанию=false)
px - горизонтальная X позиция блока с образцом шума (по умолчанию=0)
py - вертикальная Y позиция блока с образцом шума (по умолчанию=0)
Если оба px=px=0, то блок определяется автоматически по минимуму мощности спектра.
pshow - показать блок с образцом шума и его свойства (по умолчанию=false)
pcutoff - частота среза образца шума (относительно максимальной) (по умолчанию=0.1)
pfactor - степень подавления шума по образцу (0 to 1, по умолчанию=0, этот метод отменен)
sigma2 - заданная величина шума на частотах второго масштабного уровня (float>0, по умолчанию=sigma)
sigma3 - заданная величина шума на частотах третьего масштабного уровня (float>0, по умолчанию=sigma)
sigma4 - заданная величина шума на низших частотах (float>0, по умолчанию=sigma)
degrid - степень компенсации взвешивающего окна для снижения сеточности (float>0, по умолчанию=1.0)
dehalo - сила подавления ореолов (float>0, default=0)
hr - примерный радиус ореолов (float>0, default=2.0)
ht - примерный порог ореолов (float>0, default=50.0)

Наиболее важным параметром является задаваемое значение уровня шума sigma. Вы должны использовать разумные значения, основанные на априорных данных для конкретного клипа (источника видео). Типичными значениями для цифровых источников будут от 1.5 до 2.5, а для аналоговых около 3 и выше.
Хорошие значения для размера перекрытия - примерно от четверти до половины размера блока. Половина - лучше, но медленнее.
Хорошие значения размеров блока - примерно от 32 до 64.

Фильтр может дать некоторые сеточные артефакты для больших sigma и малых bw, bh и oh, ow или малых относительных размерах перекрытия.
Фильтр может дать призраки для больших sigmakratio) для 3D режимов.

Взвешивающие окна wintype=0 могут дать наихудшие сеточные артефакты, окна типа wintype=2 не производят сеточных артефактов, но могут дать некоторый звон, wintype=1 является промежуточным случаем.

Я рекомендую использовать компенсацию оконного взвешивания с degrid=1 (с версии 1.8), это улучшает качество фильтрации и снижает сеточные артефакты, особенно для 2D.

Повышение резкости приведет к некоторому ухудшению сжимаемости клипа.

Для использования метода с использованием образца структуры шума вместо обычного (слепого) метода понижения шума, вы должны:
Сначала включить режим просмотра pshow=true, и задать некоторое ненулевое значение pfactor=1.0.
Затем выбрать номер кадра и подобрать позицию блока, чтобы данный показываемый блок не содержал объектов, кроме шума характерной структуры.
Затем отключите режим просмотра pshow=false,
и установите желаемое подавление шума, рекомендуемое значение pfactor от 0.5 до 1.0.
Наилучшее окно для этого метода - wintype=2.
Параметры sigma и beta не используется в данном методе понижения шума, но Вы можете использовать данный метод в режиме просмотра pshow=true для оценки значения sigma для обычного метода понижения шума. (это не стого та же, но подобная величина).

Есть также комбинированный метод, когда Вы можете прямо задать различную величину шума sigma для наивысших и sigma2, sigma3, sigma4 для более низких частот. Коэффициенты структуры шума будут созданы внутренне из этих величин sigma путем интерполяции. Введите pfactor=0 для этого метода (внутренне он будет =1).

Особенности и ограничения

  1. Работает только с форматами хранения цвета YV12 или YUY2.
  2. Обрабатывается только указываемый один цветовой канал (Y, U или V).
  3. С версии 1.3 работает как с прогрессивными так и чересстрочными клипами.
  4. Тестирован с Avisynth v2.55, v2.56, v2.5.7.
  5. Использует внешнюю быструю библиотеку FFTW версии 3 (http://www.fftw.org)
    как Windows бинарную DLL (скомпилированную gcc под MinGW by Alessio Massaro),
    которая поддерживает нити и AMD K7 (3dNow!) в добавок к SSE/SSE2.
    Она может быть загружена с ftp://ftp.fftw.org/pub/fftw/fftw3win32mingw.zip
    Для использования плагина, Вы ДОЛЖНЫ поместить файл FFTW3.DLL из указанного пакета в некоторый каталог в путях (например, C:\WINNT\SYSTEM32). Плагин НЕ работает без этого!
  6. Библиотека FFTW работает наиболее эффективно для массивов, размеры которых (bw, bh) могут быть разложены на простые сомножители 2, 3, 5, и 7, и в противном случае использует медленный универсальный метод расчета.
  7. Первые версии были действительно мееедленными! Но последние версии являются просто медленными :-).
    Улучшен алгоритм и ассемблерные инструкции 3DNow! и SSE использованы в некоторых режимах.
  8. Алгоритм обработки оптимизирован по скорости только для прямого последовательного доступа к кадрам.
  9. Метод повышения резкости является экспериментальным, но с версии 1.1 (и 1.7) вроде неплох.
  10. Метод использования образца шума - тоже экспериментальный.
  11. Опция degrid для фильтра Кальмана (bt=0) не реализована.
  12. Для шумного видео хорошо использовать предварительную медианную фильтрацию (например DeGrainMedian) перед FFT3Dfilter.

Простые примеры скриптов:

Чтобы понизить шум яркости прогрессивного или разложенного на поля клипа:

Avisource("input.avi")
loadplugin("c:\plugins\fft3dfilter.dll")
FFT3DFilter(sigma=3)

Конечно, вы должны заменить "c:\plugins" на путь к вашей папке плагинов (и также установить имя и путь вашего видео :). Вы можете опустить команду LoadPlugin, если вы поместите файл fft3dfilter.dll в папку автозагрузки плагинов (C:\Program Files\Avisynth 2.5\plugins).

Чтобы только повысить резкость:

Avisource("input.avi")
loadplugin("fft3dfilter.dll")
FFT3DFilter(bt=-1, sharpen=0.7)

Чтобы понизить шум и слегка повысить резкость чересстрочного клипа:

Avisource("input.avi")
loadplugin("fft3dfilter.dll")
FFT3DFilter(sigma=3, sharpen=0.3, interlaced=true)

Чтобы понизить шум всех цветовых каналов (как яркости, так и цветности)

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

Корректный способ обработки всех цветовых каналов (скрипт от AI)

Avisource("input.avi")
loadplugin("fft3dfilter.dll")
YToUV(fft3dfilter(sigma=3, plane=1).UToY(),\
fft3dfilter(sigma=3, plane=2).VToY(),\
fft3dfilter(sigma=2, plane=0))

Это особенно важно, если вы используете компенсацию движения

Avisource("input.avi")
loadplugin("fft3dfilter.dll")
loadplugin("depan.dll")
motion=DepanEstimate(trust=2.5, fftw=true)
DepanInterleave(data=motion)
YToUV(fft3dfilter(sigma=3, plane=1).UToY,\
fft3dfilter(sigma=3, plane=2).VToY,\
fft3dfilter(sigma=2, plane=0))
SelectEvery(3,1)

Новый самый простой способ подавить шум во всех каналах с одинаковыми настройками

Avisource("input.avi")
loadplugin("fft3dfilter.dll")
fft3dfilter(sigma=2, plane=4)

Чтобы только понизить существующие горизонтальные ореолы

Avisource("input.avi")
loadplugin("fft3dfilter.dll")
fft3dfilter(bt=-1, plane=0, dehalo=1.0, hr=2.0, ht=50, svr=0)

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

    Алгоритм фильтра Винера основан на "3D IIR/3D Frequency Domain Filter" из источника:
MOTION PICTURE RESTORATION. by Anil Christopher Kokaram. Ph.D. Thesis. May 1993.
http://www.mee.tcd.ie/~ack/papers/a4ackphd.ps.gz в формате postscript (используйте GSview с Ghostscript для чтения).
Ищи дополнительную информацию про фильтрацию Винера и Кальмана в специальной литературе или Googles.

    Обсуждение фильтра ведется на форуме DOOM9 по Avisynth, ветка "New very slow FFT denoiser":
http://forum.doom9.org/showthread.php?s=&threadid=85790

Разрабатывается также плагин FFT3DGPU(автор - tsp) с подобным алгоритмом, но используя процессор современных видеокарт для БПФ. tsp перенес многие особенности fft3dfilter. Смотри http://forum.doom9.org/showthread.php?t=89941.

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

$English Date: 2006/09/17 18:12:43 $
Руссий текст 17.09.2006 Fizick