Videorip.info

Учимся кодировать видео и делимся опытом

Пресеты - Фильтрация

XviD4PSP 5 - Пресеты фильтрации


Описание Пресетов Фильтрации от Tempter57

Фильтрация — Применение специальных плагинов AviSynth с помощью которых можно Очень качественно подкорректировать видео. Убрать цветовой шум, убрать ореолы, повысить резкость и т.д.

 Tempter57, помогите мне, пожалуйста, разобрать работу целого скрипта (с загрузкой видео и подгрузкой плагинов), пресет DVD MDegrain2 mask4 DLS.
Я хочу понять логику строения и работы хотя бы одного из скриптов и уже опираясь на полученные знания корректировать другие Ваши скрипты.
Просто везде все на английском а с ним туго, и не только у меня...


Цитата Tempter57:

Если не возражаете, я расскажу о работе самого скрипта, условно считая, что на вход нам пришёл уже деинтерлейсный исходник в цветовом пространстве YV12 и после редактирования цветопередачи посредством Colormatrix, поскольку указанные операции автоматически производит сам конвертер, хотя всегда надо смотреть информацию MediaInfo о типе исходника (как правило это интерлейсный PAL или телесин NTSC c идущим первым верхним полем TFF).
Если исходник NTSC, то конвертер всегда правильно всё определяет и выставляет автоматически деинтерлейс TIVTC(операция обратного телесина) и вам можно особо не напрягаться, но есть исключение - это прежде всего аниме с его сложным интерлейсом и в эту группу могут входить некоторые музыкальные клипы. С интерлейсным PAL дела обстоят несколько иначе. Дело в том что оба поля в современных DVD и SATRemux синхронны по времени и при сложении образуют как бы прогрессивный кадр и так это определяет конвертер при интерлейсном анализе исходника. Иногда на титрах или вставках старых архивных копий мы наблюдаем гребёнку. Для того, чтобы обезопасить себя от дальнейших проблем рекомендуется в иконке ИНТЕРЛЕЙСА установить :
Тип исходного видео: Hybrid Progressive Interlaced
Порядок полей: TFF (см. показания MediaInfo)
Деинтерлейс : Yadif (или лучше YadifModEDI заменив в скрипте NNEDI2 на NNEDI3)
Конечный тип: Progressive
Переходим непосредственно к пресету DVD MDegrain2 mask4 DLS, который в последней редакции имеет вид:

#plugin_files
#RemoveGrainSSE2.dll
#RepairSSE2.dll
#degrainmedian.dll
#dfttest.dll
#mvtools2.dll
#fft3dfilter.dll
#fft3dgpu.dll
#WarpSharp.dll
#mt_masktools-25.dll
#MT.dll
#average.dll
#AddGrainC.dll
#GradFun2DB.dll
#Gradfun2dbmod.avs
#Ylevels.avs
#LimitedSharpenFaster Mod.avs

setmtmode(2)
setmemorymax(768)

#ColorYUV(gain_y=0,cont_y=0,cont_u=0,cont_v=0,gain_v=0,gain_u=-0,off_u=-0,off_v=-0)

source = last
#preNR = source.degrainmedian(mode=3,limity=10,limituv=12).fft3dfilter(wintype=1,degrid=1,bw=32,bh=32,ow=16,oh=16,bt=3,sigma=2.5,sigma2=1.8,sigma3=1.5,sigma4=0.5,plane=0)
preNR = source.degrainmedian(mode=3,limity=10,limituv=12).fft3dgpu(bw=16,bh=16,ow=8,oh=8,bt=4,sigma=2.5,sigma2=1.8,sigma3=1.5,sigma4=0.5,plane=0)
#preNR = source.degrainmedian(mode=3,limity=10,limituv=12).dfttest(sigma=5, ftype=1, tbsize=3)
preNR_super = preNR.MSuper(pel=2, sharp=2, rfilter=2)
source_super = source.MSuper(pel=2, sharp=2, levels=1)
vb2 = MAnalyse(preNR_super, isb=true, truemotion=true, delta=2, blksize=8, overlap=4, lambda=1000, search=5)
vb1 = MAnalyse(preNR_super, isb=true, truemotion=true, delta=1, blksize=8, overlap=4, lambda=1000, search=5)
vf1 = MAnalyse(preNR_super,isb=false, truemotion=true, delta=1, blksize=8, overlap=4, lambda=1000, search=5)
vf2 = MAnalyse(preNR_super,isb=false, truemotion=true, delta=2, blksize=8, overlap=4, lambda=1000, search=5)
maskp1 = MMask(vf1, kind=1, ysc=255).UtoY()
maskp2 = MMask(vf2, kind=1).UtoY()
maskp3 = MMask(vb1, kind=1, ysc=255).UtoY()
maskp4 = MMask(vb2, kind=1).UtoY()
tmask = average(maskp1, 0.25, maskp2, 0.25, maskp3, 0.25, maskp4, 0.25).spline36resize(source.width, source.height)
source2 = mt_merge(source,preNR,tmask,Y=3,U=3,V=3)
NR = source2.MDegrain2(source_super,vb1,vf1,vb2,vf2,thSAD=300,thSCD1=320,thSCD2=100)

# MASKING
mE = mt_edge(NR,"prewitt",0,255,0,0,V=1,U=1).mt_lut(expr="x 1.8 ^",U=1,V=1).removegrain(4,-1).mt_inflate(U=1,V=1)
mL = mt_logic(tmask.invert(),mE,"min",U=1,V=1).removegrain(20,-1)
mF = mt_logic(tmask,mE,"max",U=1,V=1).removegrain(20,-1)

# SHARPENING
cf1 = MCompensate(source_super, vf1)
cb1 = MCompensate(source_super, vb1)
pmax = source.mt_logic(cb1, "max").mt_logic(cf1, "max")
pmin = source.mt_logic(cb1, "min").mt_logic(cf1, "min")
sharp = NR.LSFmod(defaults="slow",preblur="ON", strength=100)
shrp = sharp.mt_clamp(pmax,pmin,0,0,U=2,V=2)
sL = mt_merge(NR,shrp,mL,U=2,V=2)

# ENHANCING
GF = sL.GradFun2DBmod(thr=1.4,thrC=1.8,str=0.8,strC=0.0,temp=90,adapt=64)
FSc = mt_merge(GF,sL,mF,luma=true,U=3,V=3)
FSc#.mergechroma(NR)
YlevelsS(10,1.0,248,0,255,false)

# Назначение: Качественный, наиболее основной пресет для обработки DVD
# Тип предварительного шумоподавителя: degrainmedian + fft3dfilter или dfttest
# Тип основного шумоподавителя: на основе векторного анализа оценки движения c масками движения и конечным шумоподавителем MDegrain2
# Тип шарпера: LSFmod
# Наличие фильтра DeBanding по умолчанию: GradFun2DBmod включен
# Скорость обработки: медленная

Здесь очень важно оценить уровень и характер шума исходника и правильно настроить и подобрать парметры mode и пороги по яркости и хроме в фильтре degrainmedian и все значения sigma в фильтрах fft3dfilter или dfttest. Не стремитесь в этом деле переусердствовать, чтобы не потерять в конечном счёте на детализации изображения, особенно окружающего фона вокруг движущихся объектов. К вашму внманию здесь предоставлены три варианта создания предварительно отфильтрованного клипа. Выбор за вами.

3) Создаём два супер-клипа:

  а) для веторного анализа:

preNR_super = preNR.MSuper(pel=2, sharp=2, rfilter=2)

  б) для функции временнОго шумоподавления MDegrain2 , достаточно по одному уровню:

source_super = source.MSuper(pel=2, sharp=2, levels=1)

4) Далее строим вектора на основе клипа preNR_super и векторного анализа оценки движения :

vb2 = MAnalyse(preNR_super, isb=true, truemotion=true, delta=2, blksize=8, overlap=4, lambda=1000, search=5)
vb1 = MAnalyse(preNR_super, isb=true, truemotion=true, delta=1, blksize=8, overlap=4, lambda=1000, search=5)
vf1 = MAnalyse(preNR_super,isb=false, truemotion=true, delta=1, blksize=8, overlap=4, lambda=1000, search=5)
vf2 = MAnalyse(preNR_super,isb=false, truemotion=true, delta=2, blksize=8, overlap=4, lambda=1000, search=5)

Здесь самое пристальное внимание следует уделить выбору размера блока blksize. Плагин mvtools2 предлагает выбор следующих значений: 4, 8, 16 и 32. И ежу понятно, что чем меньше размер блока , тем точнее анализ, но к сожалению увеличивается и длительность самого векторного анализа. Помимо этого при больших значениях blksize и thSAD можно нарваться в итоге на появление блендов (призраков). Особенно это характерно при обработке аниме. Плагин mvtools2 имеет ещё одно характерное свойство: практически все последующие параметры настроек практически подогнаны под размер блока blksize=8. Параметр перекрытия блоков обычно выбирается overlap=blksize\2.
Об остальных парметрах truemotion, когерентность (согласованность) векторов lambda , режиму поиска search и многих других лучше прочитать в описании плагина mvtools2. Слава богу и аллаху, разработчик этого плагина А.Балахнин (ака Fizick) - наш человек . Если ваш исходник содержит очень незначительный шум по хроме, примените в векторном анализе chroma=false. Это значительно облегчит анализ и ускорит процесс.

5) далее на основе данных векторов строим по каждому свою маску оценки движения и получаем на выходе среднеарифметическую маску оценки движения:

maskp1 = MMask(vf1, kind=1, ysc=255).UtoY()
maskp2 = MMask(vf2, kind=1).UtoY()
maskp3 = MMask(vb1, kind=1, ysc=255).UtoY()
maskp4 = MMask(vb2, kind=1).UtoY()

tmask = average(maskp1, 0.25, maskp2, 0.25, maskp3, 0.25, maskp4, 0.25).spline36resize(source.width, source.height)

6) Посредством суммарной маски движения накладываем предварительно отфильтрованный клип preNR на наш исходник source и получаем более отфильтрованный исходник source2:

source2 = mt_merge(source,preNR,tmask,Y=3,U=3,V=3)

7) Наконец мы подобрались к основному временОму шумоподавителю, основу всего этого скрипта- функции MDegrain2, после которой и получаем отфильтрованный клип:

NR = source2.MDegrain2(source_super,vb1,vf1,vb2,vf2,thSAD=300,thSCD1=320,thSCD2=100)

Функция базируется на данных векторного анализа и на базее супер клипа исходника source_super, который позволяет оградить объекты движения от воздействия столь мощной функции шумоподавления. Важнейшим параметром здесь является thSAD. Собственно величина этого параметра и задает уровень шумоподавления данной функции. Вы должны правильно оценить уровеь шума вашего исходника и не переусердствовать в этом плане. Возможно значение thSAD =300 будет слишком большим для вашего клипа, что приведёт к замыленности изображения и восковым лицам, как у мадам Тюссо. Часто для совремнных DVD значения thSAD=160...240 вполне достаточно. При уменьшении thSAD<120 можно нарваться на эффект подавления шума в шахматном порядке. Об остальных параметрах функции MDegrain лучше прочесть в описании плагина mvtools2.

8) Последующий раздел посвящён созданию маски краёв и на её основе и основе сумарной маски движения - построению логических масок для наложения отшарпованного клипа и клипа с применением фильтра DeBanding на очищенный клип:

# MASKING
mE = mt_edge(NR,"prewitt",0,255,0,0,V=1,U=1).mt_lut(expr="x 1.8 ^",U=1,V=1).removegrain(4,-1).mt_inflate(U=1,V=1)
mL = mt_logic(tmask.invert(),mE,"min",U=1,V=1).removegrain(20,-1)
mF = mt_logic(tmask,mE,"max",U=1,V=1).removegrain(20,-1)

9) для увеличения резкости изображения и повышения детализации изображения применяем фильтр LSFmod к отфильтрованному клипу и накладываем полученный результат на отфильтрованный клип с помщью логической маски mL:

# SHARPENING

cf1 = MCompensate(source_super, vf1)
cb1 = MCompensate(source_super, vb1)
pmax = source.mt_logic(cb1, "max").mt_logic(cf1, "max")
pmin = source.mt_logic(cb1, "min").mt_logic(cf1, "min")
sharp = NR.LSFmod(defaults="slow",preblur="ON", strength=100)
shrp = sharp.mt_clamp(pmax,pmin,0,0,U=2,V=2)
sL = mt_merge(NR,shrp,mL,U=2,V=2)

Здесь важнейший параметр strength -уровень повышения резкости. При завышенных значениях можно получить звон и ореолы на контурах. Внимательно подбирайте этот параметр!!!

10) Результатом воздействия столь мощных шумоподавителей является появление на изображении градиентов цветовых переходов. Особенно это проявляется вокруг светящихся объектов: лампа, фонарь, свеча. Для этих целей применяется фильтр DeBanding на основе скрипта Gradfun2dbmod.avs и полученный результат накладывается посредством маски mF на предыдуший, в итоге и получаем итоговый результат:

# ENHANCINGGF = sL.GradFun2DBmod(thr=1.4,thrC=1.8,str=0.8,strC=0.0,temp=90,adapt=64)
FSc = mt_merge(GF,sL,mF,luma=true,U=3,V=3)
FSc#.mergechroma(NR)

Описание к параметрам настройки Gradfun2dbmod.avs лучше изучить детально и отдельно. Скажу, что очень важным является параметр str, величина которого задаёт уровень вносимого яркостного мелко-дисперсионного шума, предназначенного, как для разбивания градиента цветовых переходов, так и для улучшения общей детализации изображения на замыленных исходниках.


 Ну как? Легче стало? Или начинаешь понимать сколько всего неизученного?