Посоветуйте шумодав для avisynth

Делимся опытом. Задаем вопросы и отвечаем на них. Обсуждаем статьи и новости.

Модератор: Модераторы Обсерватории

Re: Посоветуйте шумодав для avisynth

Сообщение LrRaiden » Чт фев 17, 2011 9:58 pm

посоветуйте шумодав для удаления шума, который применяется на BD для придания детальности, уж больно он внекоторых сценах неприятно выглядит да и размерчег растет.Пробовал всякие но чето не удачно получается. Вот образец
update:
Я нашол меня удовлетвориющий по качеству скрипт из пака для XviD 4PSP 5 это MCTemporalDenoise Cartoon.avs , но явно расчитан на низкое разришение . Так как 704х396 ни каких артефактов при движении в кадре нету, но переходя на 1280х720 эфективность подавления шума значительно падает и начинают смешиватся кадры-движения , как наподобие если применить команду ConvertFPS и поевляются "смешанные кадры" для плавности. И еще понравился первый скрипт вот отсуда товарища Tempter57, у него таже самая проблема. У меня вопрос , что надо подкрутить чтоб избавится от этого бага ) .
LrRaiden
Юнга
 
Сообщения: 23
Зарегистрирован: Сб апр 25, 2009 12:23 am
Откуда: С-Пб.

Re: Посоветуйте шумодав для avisynth

Сообщение Tempter57 » Ср мар 09, 2011 8:05 pm

Чтобы снизить появление блендов, необходимо в векторном анализе установить blksize=8,overlap=4 или для blksize=16,overlap=8 в функции MDegrain снизить значение thSAD<180, однако при этом снижается уровеннь шумоподавление в целом. Поэтому в вашем случае возможно необходимо отказаться от временного шумоподавителя типа MDegrain и воспользоваться пространственно-временным MCompansate или MFlow применив в нём для подавления шума fft3dfilter или dfttest, подобрав в них те значения sigma, которые обеспечат вам необходимый уровень шумоподавления или воспользоваться двухкаскадным шумоподавителем на MDegrain + MCompansate:
Код: Выделить всё
setmemorymax(768)
MT("""
#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.hqdn3d(3,2,4,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=16, overlap=8, search=5)
vb1 = MAnalyse(preNR_super, isb=true, truemotion=true, delta=1, blksize=16, overlap=8, search=5)
vf1 = MAnalyse(preNR_super,isb=false, truemotion=true, delta=1, blksize=16, overlap=8, search=5)
vf2 = MAnalyse(preNR_super,isb=false, truemotion=true, delta=2, blksize=16, overlap=8, search=5)

mask1 = source.mmask(vb2, ml=200, kind = 1, Ysc = 255, gamma=0.999, thSCD1 = 400)
mask2 = source.mmask(vb1, ml=200, kind = 1, Ysc = 255, gamma=0.999, thSCD1 = 400)
mask3 = source.mmask(vf1, ml=200, kind = 1, Ysc = 255, gamma=0.999, thSCD1 = 400)
mask4 = source.mmask(vf2, ml=200, kind = 1, Ysc = 255, gamma=0.999, thSCD1 = 400)
maskb = mt_lutxy(mask1,mask2,"x 255 < y 255 < x y + 2 / x ? y ?")
maskf = mt_lutxy(mask3,mask4,"x 255 < y 255 < x y + 2 / x ? y ?")
tmask = mt_lutxy(maskb,maskf,"x 255 < y 255 < x y + 2 / x ? y ? 32 - 255 * 223 /")# комбинированная маска оценки движения SAD

NR = source.MDegrain2(source_super,vb1,vf1,vb2,vf2,thSAD=320,thSCD1=350,thSCD2=100)
mrg = mt_merge(source, NR, tmask,Y=3, U=3,V=3)
mrg_super = mrg.Msuper(pel=2)
cf2 = MCompensate(mrg, mrg_super, vf2, thSAD=650, thSCD1=300)
cf1 = MCompensate(mrg, mrg_super, vf1, thSAD=650, thSCD1=300)
cb1 = MCompensate(mrg, mrg_super, vb1, thSAD=650, thSCD1=300)
cb2 = MCompensate(mrg, mrg_super, vb2, thSAD=650, thSCD1=300)
interleave(cf2, cf1, mrg, cb1, cb2)
#Temporalsoften(2,5,5,10,2)
#dfttest(sstring = "0.0:4.0 0.64:2.8 0.82:3.2 1.0:2.4", ftype=1, tbsize=5,threads=1)
fft3dfilter(wintype=1,degrid=1,bw=32,bh=32,ow=16,oh=16,bt=5,sigma=2.4,sigma2=1.5,sigma3=1.7,sigma4=0.7,plane=0,ncpu=1)
selectevery(5,2)
den = last

# PROTECTING
threshold = 16
cutoff = 64
maxdiff = 4
rg17 = den.removegrain(17,-1)
iOB  = source.mt_lut("x "+string(cutoff)+" >= x 0 ?",U=1,V=1)
mB   = mt_makediff(iOB,rg17,U=1,V=1).mt_binarize(128+threshold,upper=false,U=1,V=1).removegrain(5,-1)
lB   = mt_lutxy(den,source,"x y - abs "+string(maxdiff)+" <= x x y - 0 < y "+string(maxdiff)+" - x ? ?",U=1,V=1)
smB  = mt_merge(den,lB,mB,U=2,V=2)

# EDGECLEANING
mP = mt_edge(smB,"prewitt",0,255,0,0,V=1,U=1)
mS = mP.mt_expand(mode=mt_square(radius=4),U=1,V=1).mt_inflate(U=1,V=1)
mD = mt_lutxy(mS,mP.mt_inflate(U=1,V=1),"x y - "+string(24)+" <= 0 x y - ?",U=1,V=1).mt_inflate(U=1,V=1).removegrain(20,-1)
smE = mt_merge(smB,Eval("smB." + "Removegrain(2,2)"),mD,luma=true,U=3,V=3)

# MASKING
mE = mt_edge(smE,"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
pmax = source.mt_logic(cb1, "max").mt_logic(cf1, "max")
pmin = source.mt_logic(cb1, "min").mt_logic(cf1, "min")
sharp = smE.LSFmod(defaults="fast",preblur="ON", strength=100)
shrp = sharp.mt_clamp(pmax,pmin,0,0,U=2,V=2)
sL   = mt_merge(smE,shrp,mL,U=2,V=2)

# ENHANCING
GF = sL.GradFun2DBmod(thr=1.4,thrC=1.8,str=0.8,strC=0.0,temp=70,adapt=64)
FSc = mt_merge(GF,sL,mF,luma=true,U=3,V=3)
FSc#.mergechroma(den)
YlevelsS(0,1.0,255,0,255,false)
""",threads=4,overlap=16,splitvertical=false) # or threads=2

или
Код: Выделить всё
setmemorymax(768)
MT("""
#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
super = source.MSuper(pel=2, sharp=2, rfilter=2)
b2v = MAnalyse(super,isb=true, truemotion=true,delta=2,blksize=16,overlap=8,search=5,chroma=false)
b1v = MAnalyse(super,isb=true, truemotion=true,delta=1,blksize=16,overlap=8,search=5,chroma=false)
f1v = MAnalyse(super,isb=false,truemotion=true,delta=1,blksize=16,overlap=8,search=5,chroma=false)
f2v = MAnalyse(super,isb=false,truemotion=true,delta=2,blksize=16,overlap=8,search=5,chroma=false)

mask1 = source.mmask(b2v, ml=200, kind = 1, Ysc = 255, gamma=0.999, thSCD1 = 400)
mask2 = source.mmask(b1v, ml=200, kind = 1, Ysc = 255, gamma=0.999, thSCD1 = 400)
mask3 = source.mmask(f1v, ml=200, kind = 1, Ysc = 255, gamma=0.999, thSCD1 = 400)
mask4 = source.mmask(f2v, ml=200, kind = 1, Ysc = 255, gamma=0.999, thSCD1 = 400)
maskb = mt_lutxy(mask1,mask2,"x 255 < y 255 < x y + 2 / x ? y ?")
maskf = mt_lutxy(mask3,mask4,"x 255 < y 255 < x y + 2 / x ? y ?")
tmask = mt_lutxy(maskb,maskf,"x 255 < y 255 < x y + 2 / x ? y ? 32 - 255 * 223 /")# комбинированная маска оценки движения SAD

cf2 = MFlow(super, f2v, thSCD1=300)
cf1 = MFlow(super, f1v, thSCD1=300)
cb1 = MFlow(super, b1v, thSCD1=300)
cb2 = MFlow(super, b2v, thSCD1=300)
interleave(cf2, cf1, source, cb1, cb2)
fft3dfilter(wintype=1,bw=32,bh=32,ow=16,oh=16,sigma=2.2,sigma2=1.7,sigma3=1.5,sigma4=1.0,bt=5,plane=0,ncpu=1)
#Temporalsoften(2,5,5,10,2)
selectevery(5,2)

NR_super = MSuper(pel=2, levels=1, chroma=true)
den = MDegrain2(NR_super,b1v,f1v,b2v,f2v,thSAD=300,thSCD1=320,thSCD2=100)

# PROTECTING
threshold = 16
cutoff = 64
maxdiff = 4
rg17 = den.removegrain(17,-1)
iOB  = source.mt_lut("x "+string(cutoff)+" >= x 0 ?",U=1,V=1)
mB   = mt_makediff(iOB,rg17,U=1,V=1).mt_binarize(128+threshold,upper=false,U=1,V=1).removegrain(5,-1)
lB   = mt_lutxy(den,source,"x y - abs "+string(maxdiff)+" <= x x y - 0 < y "+string(maxdiff)+" - x ? ?",U=1,V=1)
smB  = mt_merge(den,lB,mB,U=2,V=2)

# EDGECLEANING
mP = mt_edge(smB,"prewitt",0,255,0,0,V=1,U=1)
mS = mP.mt_expand(mode=mt_square(radius=4),U=1,V=1).mt_inflate(U=1,V=1)
mD = mt_lutxy(mS,mP.mt_inflate(U=1,V=1),"x y - "+string(24)+" <= 0 x y - ?",U=1,V=1).mt_inflate(U=1,V=1).removegrain(20,-1)
smE = mt_merge(smB,Eval("smB." + "Removegrain(2,2)"),mD,luma=true,U=3,V=3)

# MASKING
mE = mt_edge(smE,"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
shrp = smE.ContraHD(source,cb1,cf1,0)
sL = mt_merge(smE,shrp,mL,U=2,V=2)

# ENHANCING
GF = sL.GradFun2DBmod(thr=1.4,thrC=1.8,str=0.8,strC=0.0,temp=70,adapt=64)
Fs = mt_merge(GF,sL,mF,luma=true,U=3,V=3)
Fs#.mergechroma(den)
""",threads=4,overlap=16,splitvertical=false) # or threads=2
Tempter57
Старшина 2ой статьи
Старшина 2ой статьи
 
Сообщения: 104
Зарегистрирован: Пт янв 23, 2009 3:43 am
Откуда: г.Донецк

Re: Посоветуйте шумодав для avisynth

Сообщение Vitaly » Вт апр 05, 2011 12:33 am

Уважаемые соратники, а не знает ли кто аналога фильтра NeatVideo (чтобы вычитало шум по образцу) но под GPU для использования CUDA ?
Vitaly
Лейтенант
Лейтенант
 
Сообщения: 447
Зарегистрирован: Ср ноя 05, 2003 1:21 pm
Откуда: Луганск

Re: Посоветуйте шумодав для avisynth

Сообщение Tempter57 » Пн июл 16, 2012 3:07 pm

NeatVideo 3.0 под GPU
Tempter57
Старшина 2ой статьи
Старшина 2ой статьи
 
Сообщения: 104
Зарегистрирован: Пт янв 23, 2009 3:43 am
Откуда: г.Донецк

Пред.

Вернуться в Софт: описание работы с пакетами, кодеками. Вопросы и ответы

Кто сейчас на конференции

Сейчас этот форум просматривают: нет зарегистрированных пользователей и гости: 3

cron