Страница 6 из 9

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

СообщениеДобавлено: Пн май 24, 2010 4:00 pm
Gromozeka
Tempter57
Безусловно мой скрипт я писал для своих задач и чесно говоря с синтаксисом у меня проблемы, поэтому себя не назову скриптописателем, но проводил всякие опыты, этот меня устроил.
по поводу фильтра столяревского сергея по шумоподавлению цветового шума - тоже полностью согласен и я его использую. помоему это лучший фильтр из тех что я знаю - очень хорошо сохраняет детали и так далее

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

СообщениеДобавлено: Чт июн 10, 2010 6:59 pm
Tempter57
Gromozeka писал:
по поводу фильтра столяревского сергея по шумоподавлению цветового шума - тоже полностью согласен и я его использую.

Кто бы тут сомневался, не я же лепший друг Сергея - Игорёк Тараканов :wink:

Сегодня на ваше тестирование выносится новый шарпер, вышедший из под руки mp4. guy с повышением резкости, для устранения артифактов на контрастных контурах, применена в нём функции YAHR(). Особо на него следует обратить внимание рипперам анимэ. Имя этот шарпер носит с двойным смыслом Blah (Вздор):
Код: Выделить всё
Function blah(Clip c, Int "str", int "strv", int "strh", float "de", float "dev", float "deh", float "re", float "rev", float "reh", float "cstr", float "cstrv", float "cstrh")
{# A sharpening function, Version 0.0

   str = Default(Str, 4)
      strv = Default(strv, str)
      strh = Default(strh, str)
   de = Default(de, 0.2)
      dev = Default(dev, de)
      deh = Default(deh, de)
   re = Default(re, de/2)
      rev = Default(rev, re)
      reh = Default(reh, re)
   cstr = Default(cstr, 0.5)
   cstrv = Default(cstrv, cstr)
   cstrh = Default(cstrh, cstr)

   de = 20/de
      dev = 20/dev
      deh = 20/deh
   re = 20/re
      rev = 20/rev
      reh = 20/reh

   thrc = 72
      thrcv = thrc
      thrcH = thrc
         thr2gv = 1/sqrt(thrcv)
         thr2gh = 1/sqrt(thrch)

   lp_V = C.NLLV()
      Diff_V = mt_makediff(C, lp_V)

   lp_H = lp_V.NLLH()
      Diff_H = mt_makediff(lp_V, lp_H)
         dev_ = string(rev)
         deh_ = string(reh)
         DeEmphasis = lp_H.yahr.yahr.Mt_Convolution(Horizontal=" 1 6 15 "+deh_+" 15 6 1 ", vertical =" 1 6 15 "+dev_+" 15 6 1 ", u=1, v=1)

   STRV_ = string(strv)
   Max_V = mt_luts( C, C, mode = "max", pixels = " 1 0 -1 0 ", expr = "X Y - X Y - X Y - abs 1 + * X Y - abs 1 + "+STRV_+" 1 >= "+STRV_+" 0.5 ^ "+STRV_+" ? + / - 128 +", u=1, v=1)
   Min_V = mt_luts( C, C, mode = "min", pixels = " 1 0 -1 0 ", expr = "X Y - X Y - X Y - abs 1 + * X Y - abs 1 + "+STRV_+" 1 >= "+STRV_+" 0.5 ^ "+STRV_+" ? + / - 128 +", u=1, v=1)
      MinMax_High_V = mt_lutXY( Max_V, Min_V, expr = "x 128 - abs y 128 - abs > x y ? 128 - abs", u=1, v=1)
      MinMax_Low_V = mt_lutXY( Max_V, Min_V, expr = "x 128 - abs y 128 - abs > y x ? 128 - abs", u=1, v=1)
         minmax_UL_V = mt_lutXY( MinMax_Low_V, MinMax_High_V, expr = "x y x - -", u=1, v=1)
            minmax_G_V = Average(MinMax_High_V, 0.1, MinMax_Low_V, 0.35, minmax_UL_V, 0.275, minmax_UL_V, 0.275)
   STRH_ = string(strh)
   Max_H = mt_luts( C, C, mode = "max", pixels = " 0 1 0 -1 ", expr = "X Y - X Y - X Y - abs 1 + * X Y - abs 1 + "+STRH_+" 1 >= "+STRH_+" 0.5 ^ "+STRH_+" ? + / - 128 +", u=1, v=1)
   Min_H = mt_luts( C, C, mode = "min", pixels = " 0 1 0 -1 ", expr = "X Y - X Y - X Y - abs 1 + * X Y - abs 1 + "+STRH_+" 1 >= "+STRH_+" 0.5 ^ "+STRH_+" ? + / - 128 +", u=1, v=1)
      MinMax_High_H = mt_lutXY( Max_H, Min_H, expr = "x 128 - abs y 128 - abs > x y ? 128 - abs", u=1, v=1)
      MinMax_Low_H = mt_lutXY( Max_H, Min_H, expr = "x 128 - abs y 128 - abs > y x ? 128 - abs", u=1, v=1)
         minmax_UL_H = mt_lutXY( MinMax_Low_H, MinMax_High_H, expr = "x y x - -" )
            minmax_G_H = Average(MinMax_High_H, 0.1, MinMax_Low_H, 0.35, minmax_UL_H, 0.275, minmax_UL_H, 0.275)

   Diff_V = mt_lutXY( Diff_V, minmax_G_V, expr = " x 128 - y 1 > y 1 ? * y x 128 - abs - 1 > y x 128 - abs - 1 ? / 128 +  ", u=1, v=1)
   Diff_H = mt_lutXY( Diff_H, minmax_G_H, expr = " x 128 - y 1 > y 1 ? * y x 128 - abs - 1 > y x 128 - abs - 1 ? / 128 +  ", u=1, v=1)
      Diff_HV = mt_adddiff(Diff_H, Diff_V)
         HPSharp = mt_adddiff(DeEmphasis, Diff_HV)
            rev_ = string(rev)
            reh_ = string(reh)
            ReEmphasis = HPSharp.Mt_Convolution(Horizontal=" 1 6 15 -"+reh_+" 15 6 1 ", vertical =" 1 6 15 -"+rev_+" 15 6 1 ", u=1, v=1)

   thrcv_ = string(thrcv)
      V = MT_Luts(ReEmphasis, ReEmphasis, mode="med", pixels = " 0 0 0 1 0 -1 0 2 0 -2 " ,expr = "X Y - X Y - X Y - abs 1 + * X Y - abs 1 + "+thrcv_+" 1 >= "+thrcv_+" 0.5 ^ "+thrcv_+" ? + / - 128 +", u=1,v=1).mt_Lut("X 128 - abs", u=1, v=1)
   thrch_ = string(thrch)
      H = MT_Luts(ReEmphasis, ReEmphasis, mode="med", pixels = " 0 0 1 0 -1 0 2 0 -2 0 " ,expr = "X Y - X Y - X Y - abs 1 + * X Y - abs 1 + "+thrch_+" 1 >= "+thrch_+" 0.5 ^ "+thrch_+" ? + / - 128 +", u=1,v=1).mt_Lut("X 128 - abs", u=1, v=1)

   Gauss_V = mt_Makediff(ReEmphasis, ReEmphasis.Mt_Convolution(Horizontal=" 1 ", vertical =" 1 6 15 20 15 6 1 ", u=1, v=1))
      thr2gv_ = string(thr2gv)
      cstrv_ = string(cstrv)
      Gauss_V = mt_lutXY( Gauss_V, V, expr = " x 128 - y * "+thr2gv_+" * "+cstrv_+" * 128 + ", u=1, v=1)
   Gauss_H = mt_Makediff(ReEmphasis, ReEmphasis.Mt_Convolution(Horizontal=" 1 6 15 20 15 6 1 ", vertical =" 1 ", u=1, v=1))
      thr2gh_ = string(thr2gh)
      cstrh_ = string(cstrh)
      Gauss_H = mt_lutXY(Gauss_H, H, expr = " x 128 - y * "+thr2gh_+" * "+cstrh_+" * 128 + ", u=1, v=1)
         Gauss_VH = mt_adddiff(Gauss_V, Gauss_H)
            contrast = mt_adddiff(ReEmphasis, Gauss_VH)

Return(mergechroma(contrast, C, 1))
}

# ========================================================================
# Required Functions (Необходимые вспомагательные функции):

Function blurH(clip c, int "rad", Float "CW")
{

   Rad = Default(rad, 1)
   CW = Default(CW, 0.5)

   Center = C
   Left = C.PointResize(C.width, C.height, -rad, 0, C.width, C.height)
   Right = C.PointResize(C.width, C.height, rad, 0, C.width, C.height)

   Average(Center, CW/2, Left, (1-CW)/2, Right, (1-CW)/2, Center, CW/2)

Return(last)
}

Function BlurV(clip c, int "rad", Float "CW")
{

   Rad = Default(rad, 1)
   CW = Default(CW, 0.5)

   Center = C
   Down = C.PointResize(C.width, C.height, 0, -rad, C.width, C.height)
   Up = C.PointResize(C.width, C.height, 0, rad, C.width, C.height)

   Average(Center, CW/2, Down, (1-CW)/2, Up, (1-CW)/2, Center, CW/2)

Return(last)
}

Function NLLH(Clip C, int "rad")
{

   Rad = Default(Rad, 1)

   B1 = C.BlurH(1*rad, 0.439)
   B2 = C.BlurH(3*rad, 0.833)
   B3 = C.BlurH(5*rad, 0.934)
   B4= C.BlurH(7*rad, 0.983)

      B1_D = Mt_Makediff(B1, C, u=1, v=1)
      B2_D = Mt_MakeDiff(C, B2, u=1, v=1)
      B3_D = Mt_MakeDiff(B3, C, u=1, v=1)
      B4_D = Mt_MakeDiff(C, B4, u=1, v=1)

         B2_DT = Mt_LutXY(B1_D, B2_D, " X 128 - Y 128 - X 128 - abs Y 128 - abs * 1 + * X 128 - abs Y 128 - abs * Y 128 - abs 2.273 * X 128 - abs - 0 > Y 128 - abs 2.273 * X 128 - abs - 0 ?  X 128 - abs 0 > X 128 - abs -1 X 128 - abs 0 > X 128 - 1 ? / ^ 1 ? / 1 * + 1 + / +  128 + ", u=1, v=1)
         B3_DT = Mt_LutXY(B2_DT, B3_D, " X 128 - Y 128 - X 128 - abs Y 128 - abs * 1 + * X 128 - abs Y 128 - abs * Y 128 - abs 2.67 * X 128 - abs - 0 > Y 128 - abs 2.67 * X 128 - abs - 0 ?  X 128 - abs 0 > X 128 - abs -1 X 128 - abs 0 > X 128 - 1 ? / ^ 1 ? / 1 * + 1 + / +  128 + ", u=1, v=1)
         B4_DT = Mt_LutXY(B3_DT, B4_D, " X 128 - Y 128 - X 128 - abs Y 128 - abs * 1 + * X 128 - abs Y 128 - abs * Y 128 - abs 2.9 * X 128 - abs - 0 > Y 128 - abs 2.9 * X 128 - abs - 0 ?  X 128 - abs 0 > X 128 - abs -1 X 128 - abs 0 > X 128 - 1 ? / ^ 1 ? / 1 * + 1 + / +  128 + ", u=1, v=1)

   Mt_AddDiff(B4_DT, C)

Return(last)
}

Function NLLV(Clip C, int "rad")
{

   Rad = Default(Rad, 1)

   B1 = C.BlurV(1*rad, 0.439)
   B2 = C.BlurV(3*rad, 0.833)
   B3 = C.BlurV(5*rad, 0.934)
   B4= C.BlurV(7*rad, 0.983)

      B1_D = Mt_Makediff(B1, C, u=1, v=1)
      B2_D = Mt_MakeDiff(C, B2, u=1, v=1)
      B3_D = Mt_MakeDiff(B3, C, u=1, v=1)
      B4_D = Mt_MakeDiff(C, B4, u=1, v=1)

         B2_DT = Mt_LutXY(B1_D, B2_D, " X 128 - Y 128 - X 128 - abs Y 128 - abs * 1 + * X 128 - abs Y 128 - abs * Y 128 - abs 2.273 * X 128 - abs - 0 > Y 128 - abs 2.273 * X 128 - abs - 0 ?  X 128 - abs 0 > X 128 - abs -1 X 128 - abs 0 > X 128 - 1 ? / ^ 1 ? / 1 * + 1 + / +  128 + ", u=1, v=1)
         B3_DT = Mt_LutXY(B2_DT, B3_D, " X 128 - Y 128 - X 128 - abs Y 128 - abs * 1 + * X 128 - abs Y 128 - abs * Y 128 - abs 2.67 * X 128 - abs - 0 > Y 128 - abs 2.67 * X 128 - abs - 0 ?  X 128 - abs 0 > X 128 - abs -1 X 128 - abs 0 > X 128 - 1 ? / ^ 1 ? / 1 * + 1 + / +  128 + ", u=1, v=1)
         B4_DT = Mt_LutXY(B3_DT, B4_D, " X 128 - Y 128 - X 128 - abs Y 128 - abs * 1 + * X 128 - abs Y 128 - abs * Y 128 - abs 2.9 * X 128 - abs - 0 > Y 128 - abs 2.9 * X 128 - abs - 0 ?  X 128 - abs 0 > X 128 - abs -1 X 128 - abs 0 > X 128 - 1 ? / ^ 1 ? / 1 * + 1 + / +  128 + ", u=1, v=1)

   Mt_AddDiff(B4_DT, C)

Return(last)
}

# Y'et A'nother H'alo R'educing script

function YAHR(clip clp)
{
b1    = clp.minblur(2).removegrain(11,-1)
b1D   = mt_makediff(clp,b1)
w1    = clp.aWarpSharp(depth=32,blurlevel=2,thresh=0.5)
w1b1  = w1.minblur(2,1).removegrain(11,-1)
w1b1D = mt_makediff(w1,w1b1)
DD    = b1D.repair(w1b1D,13)
DD2   = mt_makediff(b1D,DD)
clp.mt_makediff(DD2,U=2,V=2)
}

function MinBlur(clip clp, int r, int "uv")
{
uv   = default(uv,3)
uv2  = (uv==2) ? 1 : uv
rg4  = (uv==3) ? 4 : -1
rg11 = (uv==3) ? 11 : -1
rg20 = (uv==3) ? 20 : -1
medf = (uv==3) ? 1 : -200

RG11D = (r==1) ? mt_makediff(clp,clp.removegrain(11,rg11),U=uv2,V=uv2)
  \    : (r==2) ? mt_makediff(clp,clp.removegrain(11,rg11).removegrain(20,rg20),U=uv2,V=uv2)
  \    :          mt_makediff(clp,clp.removegrain(11,rg11).removegrain(20,rg20).removegrain(20,rg20),U=uv2,V=uv2)
RG4D  = (r==1) ? mt_makediff(clp,clp.removegrain(4,rg4),U=uv2,V=uv2)
  \    : (r==2) ? mt_makediff(clp,clp.medianblur(2,2*medf,2*medf),U=uv2,V=uv2)
  \    :          mt_makediff(clp,clp.medianblur(3,3*medf,3*medf),U=uv2,V=uv2)
DD    = mt_lutxy(RG11D,RG4D,"x 128 - y 128 - * 0 < 128 x 128 - abs y 128 - abs < x y ? ?",U=uv2,V=uv2)
clp.mt_makediff(DD,U=uv,V=uv)
return(last)
}

Для функционирования нового шарпера требуются следующие плагины: mt_masktools-25.dll, removegrain.dll, repair.dll, awarpsharp.dll, average.dll и medianblur.dll. Все вспомагательные функции включены во внутрь данного скрипта.
Собственно вот вам два пресета для тестирования этого шарпера:
DVD MDegrain2 Blah
Код: Выделить всё
#plugin_files
#RemoveGrainSSE3.dll
#Repair.dll
#mvtools2.dll
#awarpsharp.dll
#degrainmedian.dll
#mt_masktools-25.dll
#MT.dll
#Average.dll
#medianblur.dll
#GradFun2DB.dll
#GradFunkMirror.avs
#Blah.avs

setmtmode(2)
setmemorymax(1024)

ColorYUV(gain_y=0,cont_y=0,gain_v=0,gain_u=-0,off_u=-0,off_v=-0).levels(0,1.0,255,0,255)
source = last
Spline64Resize(source.width*2,source.height*2)
Blah(de=0.2, deh=0.025, rev=0.025, strv=4, strh=8, cstrv=0.66, cstrh=0.75)
Spline64Resize(last.width/2,last.height/2)
sharp = last

preNR = source.degrainmedian(mode=2,limity=5,limituv=6)
preNR_super = preNR.MSuper(pel=2, sharp=2, rfilter=2)
sharp_super = sharp.MSuper(pel=2, sharp=2, levels=1)
b2v = MAnalyse(preNR_super,isb=true, delta= 2, blksize=8, overlap=4, chroma=true, truemotion=true)
b1v = MAnalyse(preNR_super,isb=true, delta= 1, blksize=8, overlap=4, chroma=true, truemotion=true)
f1v = MAnalyse(preNR_super,isb=false,delta= 1, blksize=8, overlap=4, chroma=true, truemotion=true)
f2v = MAnalyse(preNR_super,isb=false,delta= 2, blksize=8, overlap=4, chroma=true, truemotion=true)
source.MDegrain2(sharp_super, b1v, f1v, b2v, f2v, thSAD=256)
GradFunkMirror()

# Назначение: хороший пресет для "мягкого" DVD с повышением резкости движущего объекта c антиайлизингом
# Тип предварительного шумоподавителя: degrainmedian
# Тип основного шумоподавителя: на основе векторного анализа оценки движения на шумоподавителе MDegrain2
# Тип шарпера: на базе sharper Blah by .mp4 guy
# Наличие фильтра DeBanding по умолчанию: включен
# Скорость обработки: быстрая

Anime MDegrain2 Blah
Код: Выделить всё
#plugin_files
#RemoveGrainSSE3.dll
#Repair.dll
#Masktools.dll
#EEDI2.dll
#mvtools2.dll
#awarpsharp.dll
#awarpsharp2.dll
#medianblur.dll
#mt_masktools-25.dll
#SangNom.dll
#MT.dll
#nnedi2.dll
#TDeint.dll
#TMM.dll
#TIVTC.dll
#yadifmod.dll
#Toon-v1.1.dll
#Average.dll
#Gradfun2db.dll
#Bifrost.dll
#cnr2.dll
#Checkmate.dll
#mipsmooth.dll
#degrainmedian.dll
#Blah.avs
#DeRainbow2.avs
#Chubbyrain2.avs
#GradFunkMirror.avs
#linedarken_toon.avs
#aa.avs

setmtmode(2)
setmemorymax(768)

#ColorYUV(levels="TV->PC")
# ===== Варианты деинтерлейса =====

# 1-й вариант NTSC 29.97 fps
#tfm(order=1).tdecimate(hybrid=1)

# 2-й вариант NTSC 29.97 fps
#AssumeTFF() # подберите поле: верхнее поле первым для DVD
#AssumeBFF() # подберите поле: нижнее поле первым для видеокамер
#edeintted = nnedi2(field=-2,qual=3)
#res = TDeint(edeint=edeintted,order=-1,mode=2,sharp=true,mtnmode=3,full=false,tryWeave=false,type=1,emask=TMM(mode=1))
#tfm(order=-1,clip2=res,pp=7,slow=2,mode=2,chroma=false,display=false).tdecimate(hybrid=1,mode=1,vfrDec=0)

# 3-й вариант NTSC 29.97 fps
#interp = nnedi2(field=1,qual=3)
#deint = tdeint(mode=0,order=1,field=1,edeint=interp,slow=2,emask=TMM(mode=0,order=1,field=1))
#tfm(mode=3,order=1,clip2=deint,slow=2).tdecimate() # or tdecimate(hybrid=1)

# 4-й вариант PAL 25.00 fps
#edeintted = TDeint(edeint=TomsMoComp(-1,11,0),order=-1,mode=0,sharp=true,mtnmode=3,full=true,tryWeave=false,type=1,slow=2,emask=TMM(mode=0))
#Yadifmod(mode=0,edeint=edeintted)

# 5-й вариант PAL 25.00 fps
#AssumeTFF() # подберите поле: верхнее поле первым для DVD
#AssumeBFF() # подберите поле: нижнее поле первым для видеокамер
#edeintted = nnedi2(field=-2,qual=3)
#TDeint(edeint=edeintted,order=-1,mode=2,sharp=true,mtnmode=3,full=false,tryWeave=false,type=1,emask=TMM(mode=1))

# 6-й вариант PAL 25.00 fps
#interp = nnedi2(field=1,qual=3)
#tdeint(mode=0,order=1,field=1,edeint=interp,slow=2,emask=TMM(mode=0,order=1,field=1))

# ===== подавление радужных помех =====

source = last
#source = last.Chubbyrain2().Checkmate(tthr2=0)
#source = last.DeRainbow2()

# ===== Варианты затемнения линий =====

dark = source.toon(0.2) # качественная функция затемнения линий
#dark = source.FastLineDarkenMOD2(thinning=24, strength=48)
#dark = source.linedarken_toon()

# ===== Предварительное повышение резкости =====
Spline64Resize(dark.width*2,dark.height*2)
mt_convolution(horizontal=" 1 6 15 -112 15 6 1 ",vertical =" 1 ", u=2, v=2) # horizontal unsharpmask
Blah(de=0.2, deh=0.025, rev=0.025, strv=4, strh=8, cstrv=0.66, cstrh=0.75)
Spline64Resize(last.width/2,last.height/2)

# ===== Варианты антиайлизинга =====

#aa = last.daa()
#aa = last.ediaa()
aa = last.maa()

sD = mt_merge(source,aa)

# ===== Шумоподавитель =====

preNR = sD.degrainmedian(mode=2,limity=5,limituv=6)
preNR_super = preNR.MSuper(pel=2, sharp=2, rfilter=2)
sD_super = sD.MSuper(pel=2, sharp=2, levels=1)
b2v = MAnalyse(preNR_super,isb=true, delta= 2, blksize=8, overlap=4, chroma=true, truemotion=true)
b1v = MAnalyse(preNR_super,isb=true, delta= 1, blksize=8, overlap=4, chroma=true, truemotion=true)
f1v = MAnalyse(preNR_super,isb=false,delta= 1, blksize=8, overlap=4, chroma=true, truemotion=true)
f2v = MAnalyse(preNR_super,isb=false,delta= 2, blksize=8, overlap=4, chroma=true, truemotion=true)
sD.MDegrain2(sD_super, b1v, f1v, b2v, f2v, thSAD=256)
GradFunkMirror(strength=1.4)

# Назначение: качественный пресет для анимэ
# Подавление радужности изображения по умолчанию: отключено
# Тип затемнения линий по умолчанию: toon
# Тип антиайлизинга по умолчанию: maa
# Тип шумоподавителя: MDegrain2
# Тип шарпера: Blah с YAHR для уменьшения ореолов и звона
# Наличие фильтра DeBanding по умолчанию: включен
# Скорость обработки: медленная

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

СообщениеДобавлено: Чт июн 10, 2010 7:28 pm
Gideon Vi
Tempter57, спасибо за информацию. На Ваш взгляд он лучше LSFmod?

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

СообщениеДобавлено: Пт июн 11, 2010 8:26 am
Tempter57
Gideon Vi писал(а):Tempter57, спасибо за информацию. На Ваш взгляд он лучше LSFmod?

Трудно так сказать, ещё мало статистики и исследований, ведь Blah вчера вышел только. В принципе это шарперы разного типа. Blah относится к разряду median sharpen, успешно переносящих векторный анализ. LSFmod - относится к фильтрам повышения резкости пост-обработки, вслед за шумодавом стоит в скрипте. Они могут просто дополнять друг друга вместе. Вот здесь автор приводит скрипты для сравнения действия различных шарперов. Недостаток у этого фильтра есть - черезвычано низкая скорость обработки из-за апскейла. Не случайно в варианте с шумодавом есть вариант без апскейла. Сами посудите, ведь если LSFmod тоже задать апскейл до 4, то он отработает повышение резкости значительно лучше без видимых артифактов в виде звона на контурах, но при этом значительно упадёт скорость обработки. Эти два гуру : .mp4 guy и Didйе устроили в последнее время здоровую конкуренцию: кто создаст более лучший median sharpen. Нам всем это на пользу. Собственно, перед этим Didйе создал Twister sharpen (см. пресет DVD Twister Sharpen), который тоже отрабатывает повышение резкости без артифактов и как раз использует свой вариант median sharpen перед векторным анализом с MDegrain2,3 шумоподавителем и дополнительной пост обработкой LSFmod c removegrain(11,-1).
Способы достижение цели у этой парочки друзей разные: .mp4 guy ударился решать вопрос довольно сложными функциями масок mt_masktools, а Didйе довольно различными функциями плагина removegrain. В результате мы получаем различные решения и подход в этом вопросе, что не может не радовать.

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

СообщениеДобавлено: Сб июн 19, 2010 4:52 am
Gideon Vi
Tempter57, спасибо за информацию

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

СообщениеДобавлено: Пн июл 19, 2010 8:56 pm
Tempter57
Отредактировал и обновил архив plugins_filtering для XviD 4PSP 5.0.37.8. Сильно изменились пресеты аниме, обновлены все плагины. На такие изменения в обработке аниме сподвигли результаты методов подавление ореолов, описанные в ветке Halo killings и в частности работы Виталия Горбатенко по обработке аниме и скрипт DeHalo_2 от Didйе.

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

СообщениеДобавлено: Вс авг 22, 2010 6:28 am
Gideon Vi
Отредактировал и обновил архив plugins_filtering для XviD 4PSP 5.0.37.8

на данный момент более свежего пакета нет?

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

СообщениеДобавлено: Вс сен 12, 2010 6:42 pm
jur
Tempter57, большое спасибо за твой опыт! Я был совершенно поражен результатами, показанными в этом посте! Но все никак не мог постичь, как же использовать этот сложный для понимания код :-) Я ведь совершенный новичок в этих не простых вопросах. И вот сегодня я собрался с духом и попробовал. Полнейший восторг! Еще раз огромное спасибо за науку!

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

СообщениеДобавлено: Пт сен 17, 2010 10:12 pm
Tempter57
Попробуйте ещё такие два пресета, думаю восторг будет по-лучше:
Код: Выделить всё
#plugin_files
#RemoveGrainSSE2.dll
#RepairSSE2.dll
#MedianBlur.dll
#FluxSmooth.dll
#mt_masktools-25.dll
#mvtools2.dll
#SangNom.dll
#AddGrainC.dll
#GradFun2DB.dll
#GradFun2DBmod.avs
#maa.avs
#sbr.avs
#minblur.avs
#minblur3.avs
#Ylevels.avs
#LimitedSharpenFaster.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)
YlevelsS(0,1.0,255,0,255,false)

#ApplyRange(x,y,"maa") # где x и y первый и последний кадр последовательности, на которую применяем антиайлиазинг по необходимости на титрах
source = last
ox = source.width()
oy = source.height()

mb2 = source.sharpen(0.35).minblur(2)
mb2a = mb2.sbr()
e1 = mb2.mt_edge("prewitt",0,255,0,255).mt_inflate().mt_inflate().mt_expand().mt_inflate().mt_inflate().greyscale
e2 = e1.mt_edge("prewitt",0,255,0,255).mt_deflate().mt_expand().greyscale
e3 = mt_lutxy(e2,e2.mt_expand().mt_inpand(),"y x - 2 *").mt_inflate()
dh = source.mt_merge(mb2a.AddgrainC(8),e2)
pre = mb2.sbr().FluxsmoothT(4)
shrp = dh.mt_adddiff(mt_makediff(dh,dh.minblur(2).sbr()),U=2,V=2)
shrp = shrp.sharpen(0.25).mt_merge(shrp,e2.mt_inflate().mt_inflate().removegrain(20).mt_logic(e3,"max"))
shrp = mt_lutxy(shrp,shrp.gaussresize(48,32,p=16).gaussresize(ox,oy,p=5),expr="x x y - abs 1 2.618 / ^ 0.618 * x y - 3 ^ x y - abs 3 ^ 1.618 + / * +",
\ yexpr="x x y - abs 1 2.618 / ^ 0.786 * x y - 3 ^ x y - abs 3 ^ 1.618 + / * +",U=3,V=3)
shrpD = mt_makediff(shrp,dh,U=3,V=3).sbr()
shrpDD = mt_makediff(shrpD,shrpD.removegrain(4),U=3,V=3)
shrpDD = mt_makediff(shrpDD,shrpDD.removegrain(20),U=3,V=3)
shrp = shrp.mt_adddiff(shrpDD,U=3,V=3)
shrp = shrp.minblur3()

presup = pre.MSuper(pel=2,sharp=2)
shrpsup = shrp.MSuper(pel=2,levels=1)
#bv3 = MAnalyse(presup, isb=true, delta=3,blksize=16,overlap=4,truemotion=false,search=4,searchparam=8)
bv2 = MAnalyse(presup, isb=true, delta=2,blksize=16,overlap=4,truemotion=false,search=4,searchparam=8)
bv1 = MAnalyse(presup, isb=true, delta=1,blksize=16,overlap=4,truemotion=false,search=4,searchparam=8)
fv1 = MAnalyse(presup, isb=false,delta=1,blksize=16,overlap=4,truemotion=false,search=4,searchparam=8)
fv2 = MAnalyse(presup, isb=false,delta=2,blksize=16,overlap=4,truemotion=false,search=4,searchparam=8)
#fv3 = MAnalyse(presup, isb=false,delta=3,blksize=16,overlap=4,truemotion=false,search=4,searchparam=8)
#dh.MDegrain3(shrpsup,bv1,fv1,bv2,fv2,bv3,fv3,thSAD=256)
dh.MDegrain2(shrpsup,bv1,fv1,bv2,fv2,thSAD=256)
Limitedsharpenfaster(ss_x=1.25,ss_y=1.25,strength=24)
mergeluma(removegrain(11,-1).removegrain(11,-1).removegrain(11,-1),0.11)
GradFun2DBmod(thr=1.4,thrC=1.8,mode=2,str=0.0,strC=0.0,temp=90,adapt=64,mask=false,show=false)

function minblur3(clip c) {
rgD = mt_makediff(c,c.removegrain(3))
sbD = mt_makediff(c,c.sbr())
DD  = mt_lutxy(rgD,sbD,"x 128 - y 128 - * 0 < x y + 2 / x 128 - abs y 128 - abs < x y ? ?")
c.mt_makediff(DD,U=2,V=2)   }


Код: Выделить всё
#plugin_files
#RemoveGrainSSE2.dll
#RepairSSE2.dll
#mvtools2.dll
#Warpsharp.dll
#mt_masktools-25.dll
#MT.dll
#AddGrainC.dll
#Gradfun2db.dll
#Gradfun2dbmod.avs
#Ylevels.avs
#dehalo_alpha_2BD.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)
YlevelsS(0,1.0,255,0,255,false)

o=last
dh3  = o.dehalo_alpha_2BD(rx=2.0,ry=1.7,darkstr=1.00,brightstr=1.00*0.8)
\      .dehalo_alpha_2BD(rx=2.5,ry=1.9,darkstr=0.85,brightstr=0.85*0.6)
\      .dehalo_alpha_2BD(rx=3.0,ry=2.1,darkstr=0.74,brightstr=0.74*0.4) #  dh3 = 3-fold dehalo_alpha
e3   = mt_lutxy(dh3.mt_expand().mt_expand(),dh3.mt_inpand().mt_inpand(),"x y - 10 - 4 *").mt_expand()
mrg  = o.mt_merge(dh3,e3,U=2,V=2)
x1   = mrg.removegrain(11)
fin1 = mrg.mt_adddiff(mt_makediff(x1,x1.rg114()).mt_lut("x 128 - 1.501 * 128 +"),U=2,V=2)
x2   = x1.sbr()
fin2 = fin1.mt_adddiff(mt_makediff(x2,x2.rg114()).mt_lut("x 128 - 1.499 * 128 +"),U=2,V=2) # fin2 = dh3 with 2-step mediansharpen (free)

mrgD = mt_makediff(mrg,o)
fin2D= mt_makediff(mrg,fin2)
DD   = fin2D.repair(mrgD,1)
fin3 = mrg.mt_makediff(DD,U=2,V=2) #fin3 = fin2 with sharpness limiting "visually best" is fin2, the others are just for comparison

o_super = o.MSuper(pel=2, sharp=2, rfilter=4)
fin3_super = fin3.MSuper(pel=2, sharp=2, levels=1)
vb2 = MAnalyse(o_super,isb=true, delta=2,blksize=8,overlap=4,truemotion=false,search=4,searchparam=6)
vb1 = MAnalyse(o_super,isb=true, delta=1,blksize=8,overlap=4,truemotion=false,search=4,searchparam=6)
vf1 = MAnalyse(o_super,isb=false,delta=1,blksize=8,overlap=4,truemotion=false,search=4,searchparam=6)
vf2 = MAnalyse(o_super,isb=false,delta=2,blksize=8,overlap=4,truemotion=false,search=4,searchparam=6)
den = mrg.MDegrain2(fin3_super,vb1,vf1,vb2,vf2,thSAD=256)

# SHARPENING
cb1 = MCompensate(o_super,vb1)
cf1 = MCompensate(o_super,vf1)
pmax = o.mt_logic(cb1, "max").mt_logic(cf1, "max")
pmin = o.mt_logic(cb1, "min").mt_logic(cf1, "min")
sharp = den.LSFmod(ss_x=1.25,ss_y=1.25,strength=24)
sharp.mt_clamp(pmax,pmin,0,0,U=2,V=2)
mergeluma(removegrain(11,-1).removegrain(11,-1).removegrain(11,-1),0.11)

# ENHANCING
GradFun2DBmod(thr=1.4,thrC=1.8,mode=2,str=0.4,strC=0.0,temp=90,adapt=64,mask=false,show=false)

function DeHalo_alpha_2BD(clip clp, float "rx", float "ry", float "darkstr", float "brightstr", float "lowsens", float "highsens", float "ss")
{
rx        = default( rx,        2.0 )
ry        = default( ry,        2.0 )
darkstr   = default( darkstr,   1.0 )
brightstr = default( brightstr, 1.0 )
lowsens   = default( lowsens,    50 )
highsens  = default( highsens,   50 )
ss        = default( ss,        1.5 )

LOS = string(lowsens)
HIS = string(highsens/100.0)
DRK = string(darkstr)
BRT = string(brightstr)
ox  = clp.width()
oy  = clp.height()
uv  = 1
uv2 = (uv==3) ? 3 : 2

halos  = clp.bicubicresize(m4(ox/rx),m4(oy/ry)).bicubicresize(ox,oy,1,0)
are    = mt_lutxy(clp  .mt_expand(U=uv,V=uv).mt_expand(U=uv,V=uv).mt_expand(U=uv,V=uv),clp  .mt_inpand(U=uv,V=uv).mt_inpand(U=uv,V=uv).mt_inpand(U=uv,V=uv),"x y -","x y -","x y -",U=uv,V=uv)
ugly   = mt_lutxy(halos.mt_expand(U=uv,V=uv).mt_expand(U=uv,V=uv).mt_expand(U=uv,V=uv),halos.mt_inpand(U=uv,V=uv).mt_inpand(U=uv,V=uv).mt_inpand(U=uv,V=uv),"x y -","x y -","x y -",U=uv,V=uv)
so     = mt_lutxy( ugly, are, "y x - y 0.001 + / 255 * "+LOS+" - y 256 + 512 / "+HIS+" + *" )
lets   = mt_merge(halos,clp,so,U=uv,V=uv)
remove = (ss==1.0) ? clp.repair(lets,1,0)
          \        : clp.lanczosresize(m4(ox*ss),m4(oy*ss))
          \             .mt_logic(lets.mt_expand(U=uv,V=uv).bicubicresize(m4(ox*ss),m4(oy*ss)),"min",U=uv2,V=uv2)
          \             .mt_logic(lets.mt_inpand(U=uv,V=uv).bicubicresize(m4(ox*ss),m4(oy*ss)),"max",U=uv2,V=uv2)
          \             .lanczosresize(ox,oy)
them   = mt_lutxy(clp,remove,"x y < x x y - "+DRK+" * - x x y - "+BRT+" * - ?",U=2,V=2)

return( them )
}

# "rg114" -- use removegrain(11), but maximally as much as removegrain(4) did in the 3x3 neighborhood

function rg114(clip c) {
d=mt_makediff(c,c.removegrain(11)).repair(mt_makediff(c,c.removegrain(4)),1)
c.mt_makediff(d,U=2,V=2) }

# "use highpass of a blur's difference" - function
function sbr(clip c) {
rg11D=mt_makediff(c,c.removegrain(11,-1))
rg11DD=mt_makediff(rg11D,rg11D.removegrain(11,-1)).mt_lutxy(rg11D,"x 128 - y 128 - * 0 < 128 x 128 - abs y 128 - abs < x y ? ?")
c.mt_makediff(rg11DD,U=2,V=2) }

function m4(float x) {return(x<16?16:int(round(x/4.0)*4))}

Если хочется применить эти фильтры для SATRip, надо довавить в обработку в начале скрипта фильтр:
Код: Выделить всё
Cnr2("xxx",4,5,255) # удаление радужности и цветового шума

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

СообщениеДобавлено: Пт сен 17, 2010 11:07 pm
jur
Tempter57 писал(а):Попробуйте ещё такие два пресета, думаю восторг будет по-лучше:

Большое спасибо, уважаемый Tempter57! Сразу руки зачесались! ;-) Как раз собираюсь создать рип с HD-источника (1280х534, незабвенный Гарри наш Портер нумбер 6). Попробую применить.

Tempter57 писал(а):Если хочется применить эти фильтры для SATRip, надо довавить в обработку в начале скрипта фильтр:
Код: Выделить всё
Cnr2("xxx",4,5,255) # удаление радужности и цветового шума

Пока SAT-приемника не имею, в основном перекодирую качественные HD-источники для своего "железа" (Sony DVP-NS33S). Ну а в будущем - кто знает?...

P.S. Прошу прощения, что я сразу так на "ты": просто за многие годы привык относиться к собеседнику на форуме как к хорошему знакомому :-)

P.P.S. "Раз пошла такая пьянка" (C), то прошу меня простить, но очень хотелось бы высказать некоторые свои соображения :-)

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

Поясню. Я - не ученый, я - прикладник. Ваши серьезные рассуждения о глубинных вопросах применения тех или иных скриптов, влияние изменения их параметров на качество конечного результата, взаимозависимость параметров друг от друга, - все это слишком сложно для моего понимания. (Думаю, что не только для моего.)

Я начал с того, что три скрипта из этого поста сохранил в отдельных файлах и назвал их "Preset_1", "Preset_2" и "Preset_3". После прочтения ответа с новыми скриптами я задумался: "А ведь неплохо было бы как-то их систематизировать". К примеру, скрипт "Preset_2" очень хорош для замыленных источников, скрипты 1 и 3 - менее жесткие. Эти новые скрипты тоже имеют какие-то свои особенности (их-то я и буду завтра изучать). В результате таких опытов, наверное, можно создать некий FAQ, в котором кратко перечислены особенности конкретного скрипта и наиболее подходящие сферы его применения. Уверен, что подобный FAQ явится совершенно незаменимым путеводителем для таких, не умудренных глубинными знаниями, простых рипперов, как я :-)

Что скажете, уважаемые коллеги?

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

СообщениеДобавлено: Вс сен 19, 2010 2:31 am
LrRaiden
посоветуйте шумодав для БД-рипа, сам филм анимационный снят ещё 84 году, хочу избавится от мелкого яркостного шума.

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

СообщениеДобавлено: Пн сен 20, 2010 1:33 am
Tempter57
Приблизительно такой скрипт для аниме высокого разрешения:
Код: Выделить всё
ExBorders()
MergeChroma(aWarpSharp2(chroma=4))
#warpsharp(120,5,85,-0.6)

DeHalo_2()
gradfun2db(1.51)

# ==== варианты затемнения линий ====
#toon(0.2)#.Warpsharp(depth=80)
#linedarken_toon()
vmToon(sharpen=true,thinning=24,strength=36,luma_cap=203,threshold=8)

EdgeCleaner(smode=1,strength=24)
crop( 16, 16, -16, -16 )

# ==== варианты антиайлиазинга ====
#ediaa()
#daa()
maa()

# ===== Denoiced =====
sD = last.LSFmod(edgemode=0,strength=35,overshoot=2).aWarpSharp2(chroma=2, depth=2, blur=1, thresh=252)
Temporal = sD.hqdn3d(0.2, 0.2, 8, 8)
sD.Vaguedenoiser(method=4, nsteps=10, wavelet=2, Wiener=true, auxclip=temporal, percent=95, chromaT=1.5, wratio=1.5, threshold=2)
ttempsmooth(maxr=3)
LSFmod(strength=50,Smode=3,Smethod=3,Lmode=0,overshoot=0,secure=true,edgemode=0,soft=0,soothe=false,ss_x=1.5,ss_y=1.5)
Gradfun2dbmod(thr=1.2,thrC=1.6,mode=3,str=0.3,temp=97,adapt=64)

# ======================= вспомагательные функции ========================
Function DeHalo_2(clip i)
{
e1 = i.mt_edge("min/max",0,255,0,255).mt_lut("x 4 - 4 *")#.greyscale
e2 = e1.mt_expand().mt_expand()
e2 = e2.mergeluma(e2.mt_expand(),0.5).mt_inflate()
e3 = e2.mergeluma(e2.mt_expand(),0.5).mt_lutxy(e1.mt_deflate(),"x y 1.2 * -").mt_inflate()#.greyscale
# e3 = e2.mergeluma(e2.mt_expand(),0.5).mt_lutxy(e1.mt_deflate().mt_deflate(),"x y 1.2 * -").mt_inflate().mt_inflate().greyscale
# e3 = e3.nnedi2_rpow2(2,cshift="bicubicresize").bicubicresize(presharp.width,presharp.height)

blurr = i.minblur(1).removegrain(11,-1).removegrain(11,-1)

dh1  = i.repair(i.removegrain(2),1).mt_merge(blurr,e3,U=2,V=2)
dh1D = mt_makediff(i,dh1)
tmp  = dh1.sbr()
med2D = mt_makediff(tmp,tmp.medianblur(2,0,0))
DD  = mt_lutxy(dh1D,med2D,"x 128 - y 128 - * 0 < 128 x 128 - abs y 128 - abs 2 * < x y 128 - 2 * 128 + ? ?")
dh2 = dh1.mt_adddiff(DD,U=2,V=2)
#interleave(i,dh2)
dh2
return(last)
}

Function ExBorders( clip c)
{
w = c.width()
h = c.height()
vflip = c.FlipVertical()
hflip = c.FlipHorizontal()
c
stackhorizontal( hflip.crop( w-16, 0, 16, h ).addborders( 0, 16, 0, 16 ),
\ stackvertical( vflip.crop( 0, h-16, w, 16 ), c, vflip.crop( 0, 0, w, 16 ) ),
\ hflip.crop( 0, 0, 16, h ).addborders( 0, 16, 0, 16 ) )
Return last
}

# =====================================================

# LineDarkenToon use the idea of mf_toon (0.5) for linedarken.
# I wanted a really small fast code like FastLineDarken but with similar output like
# mf_toon and this is the result.
#
# needed filters:
# - WarpSharp
# - MaskTools v2
# - AWarpSharp2
# - RemoveGrain
# Common parameters are sstrength, sdboost and srange.
# If speed is most important for you, test fast=true.
# With fast=true no edgemask will be created, just a simple fast weighting.
# But this looks imho still better than FastLineDarken.



function linedarken_toon(clip orig, float "sstrength", "sdboost", int "srange", "warpdepth", bool "fast")
{
###### parameters ######
sstr = string(default(sstrength, 180)/255.0)
srange = default(srange, 0)
sdboost = default(sdboost, 1.0)
wdepth = default(warpdepth, 8)
fast = default(fast, false)

###### filtering ######
sharp = orig.Unsharpmask(300, 4, 0)

orig.mt_edge(thy1=3,thy2=255,mode="prewitt",Y=3,V=1,U=1)
mt_lut("x "+string(srange)+" + 195 / 1.0 "+string(sdboost)+" / ^ 255 *",U=1,V=1).mt_inflate().mt_inflate().mt_inflate()
linemask = mt_lutxy(orig, last, yexpr="300 1 x 255 / - 255 y - * x 1.14 ^ + - "+sstr+" *", uexpr="x", vexpr="x")

fast==false ? mt_merge(orig, sharp, linemask, Y=3, U=2, V=2) :
\ mt_lutxy(orig,sharp,"x y < 40 y < | x y x - 1 x 255 / - 2 ^ * 1 y 128 / - 4 ^ * "+sstr+" * x + ?",U=2,V=2)

final = wdepth<=0 ? last : aWarpSharp2(last,chroma=4,depth=wdepth,blur=1)

return final
}


function limited_toon(clip c, int "level", int "dark", int "line")
{
   level = default(level,24)
   dark  = default(dark,64)
   line  = default(line,64)
   o = c.linedarken_toon(warpdepth=8, sstrength=dark).FastLineDarkenMOD2(thinning=24, strength=line)
   return mSoothe(o, c, level)
}


function m_contra (clip denoised, clip original)
{
s = denoised.minblur(1,1) # Damp down remaining spots of the denoised clip.
allD = mt_makediff(original,denoised) # The difference achieved by the denoising.
ssD = mt_makediff(s,s.removegrain(11,-1)) # The difference of a simple kernel blur.
ssDD = ssD.repair(allD,1) # Limit the difference to the max of what the denoising removed locally.
ssDD = SSDD.mt_lutxy(ssD,"x 128 - abs y 128 - abs < x y ?") # abs(diff) after limiting may not be bigger than before.

denoised.mt_adddiff(ssDD,U=2,V=2) # Apply the limited difference. (Sharpening is just inverse blurring.)

return( last )
}

function lite_dark(clip src, int "tline", int "fline")
{
   tline  = default(tline,64)
   fline  = default(fline,64)
b=src
a=b.LSFmod(ss_x=1.5, ss_y=1.5, smode=3, strength=60, overshoot=1, undershoot=1)
a=a.linedarken_toon(warpdepth=0, sstrength=tline).FastLineDarkenMOD2(thinning=0, strength=fline)
b=b.LSFmod()
return m_contra(b, a)
}

function FastLineDarkenMOD2( clip c, int "strength", int "luma_cap", int "threshold", int "thinning")
{
## parameters ##
str = string(default(strength, 48) /128.)
lum = string(default(luma_cap, 191))
thr = string(default(threshold, 4))
thinning = default(thinning,24)
thn = string(thinning /16.)

## filtering ##
exin = c.mt_expand().mt_inpand()
diff = mt_lutxy(c,exin,yexpr="y "+lum+" < y "+lum+" ? x "+thr+" + > x y "+lum+" < y "+lum+" ? - 0 ? 127 +",uexpr="x",vexpr="x",u=2, v=2)
#linemask= mt_lut(diff.mt_inpand(),"x 127 - "+thn+" * 255 +").mt_convolution("1 1 1","1 1 1",y=3,u=0,v=0)
linemask= mt_lut(diff.mt_inpand(),"x 127 - "+thn+" * 255 +").RemoveGrain(20,-1) # gives a little speed boost.
thick = mt_lutxy(c, exin, yexpr="y "+lum+" < y "+lum+" ? x "+thr+" + > x y "+lum+" < y "+lum+" ? - 0 ? "+str+" * x +",uexpr="x",vexpr="x",u=2, v=2)
thin = mt_lutxy(c.mt_expand(U=2,V=2),diff,yexpr="x y 127 - "+str+" 1 + * +",u=2, v=2)

return (thinning == 0) ? thick : mt_merge(thin,thick,linemask,y=3,u=2,v=2)
}

Конечно, скрипт на векторном анализе даст чуть лучше результат, но будет для HD разрешения очень медленным.
Код: Выделить всё
source = last
  source.ExBorders()
  MergeChroma(aWarpSharp2(chroma=4))
# warpsharp(120,5,85,-0.6)
# DeHalo_Alpha_MT(rx=2.0,ry=2.0,darkstr=0.1,brightstr=0.4,ss=1.5)
  DeHalo_2()
  gradfun2db(1.51)
# LSFmod(ss_x=1.5, ss_y=1.5, smode=3, strength=60, overshoot=1, undershoot=1)

# toon(0.2).Warpsharp(depth=80)
  FastLineDarkenMod(thinning=24,strength=48)#.awarpsharp2(depth=8)
  EdgeCleaner(smode=1,strength=24)
  crop( 16, 16, -16, -16 )

#ediiaa()
#daa()
maa()

# ===== Denoiced =====
sD = last
sharp = sD.LSFmod(edgemode=0,strength=35,overshoot=2).aWarpSharp2(chroma=2, depth=2, blur=1, thresh=252)
source_super = source.MSuper(pel=2, sharp=2, rfilter=2)
sharp_super = sharp.MSuper(pel=2, sharp=2, levels=1)
vf1 = source_super.MAnalyse(isb=false, lambda=1000, blksize=8, overlap=4, delta=1, search=5, searchparam=4, dct=5)
vb1 = source_super.MAnalyse(isb= true, lambda=1000, blksize=8, overlap=4, delta=1, search=5, searchparam=4, dct=5)

tsadf = source.mmask(vf1, ml = 200, kind = 1, Ysc = 255, gamma = 0.999, thSCD1 = 450) # маска SAD назад
tsadb = source.mmask(vb1, ml = 200, kind = 1, Ysc = 255, gamma = 0.999, thSCD1 = 450) # маска SAD назад
#tmask = mt_lutxy(tsadb,tsadf,"x 255 < y 255 < x y + 2 / x ? y ? 32 - 255 * 223 /")# комбинированная маска оценки движения SAD
tmask = mt_average(tsadf,tsadb,U=1,V=1).mt_lut(expr="x 1.6 ^",U=1,V=1)

den = sharp.MDegrain1(sharp_super,vb1,vf1,thSAD=240,thSCD1=300,thSCD2=90)
mrg = mt_merge(sD, den, tmask,Y=3, U=3,V=3)
mrg_super = mrg.Msuper(pel=2)

cf1 = MCompensate(mrg, mrg_super, vf1, thSCD1 = 400)
cb1 = MCompensate(mrg, mrg_super, vb1, thSCD1 = 400)

inter = interleave(cf1, mrg, cb1)
den = inter.dfttest(sstring = "0.0:4.0 0.64:2.4 0.82:3.0 1.0:1.5", ftype=1, tbsize=3).selectevery(3,1)
#den = inter.Temporalsoften(1,7,9,15,2).selectevery(3,1)

# 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)

# MASKING
mE = mt_edge(smB,"cartoon",4,32,4,32,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 = smB.LSFmod(defaults="fast",preblur="ON", strength=80)
shrp = sharp.mt_clamp(pmax,pmin,0,0,U=2,V=2)
sL   = mt_merge(smB,shrp,mL,U=2,V=2)

# ENHANCING
GF = sL.GradFun2DBmod(thr=1.4,thrC=1.8,str=0.4,strC=0.0,temp=100,adapt=64)
filtred = mt_merge(GF,sL,mF,luma=true,U=3,V=3)#.mergechroma(den)

# DARK MASKING
th_low  = 1
th_high = 96
dmask = sD.levels(th_low,1,th_high,255,0,false).blur(1.58).blur(1.58)
mt_merge(sD, filtred, dmask, U=3, V=3, luma=true)

Надеюсь, остальные плагины у вас есть, если чего не хватает,- скачайте мой архив выше.

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

СообщениеДобавлено: Сб окт 09, 2010 5:41 pm
jur
Tempter57

Уважаемый коллега, большое спасибо за интересные и качественные пресеты! В последнее время я попробовал немало разных вариантов. В частности, из этого поста. Второй из них мне показался более замыливающим, а первый - превосходен! Но имеет один серьезный недостаток: очень медленный, кодирует со скоростью 7-8 кадров. (У меня обычный, двухядерный комп.)

Поэтому мне в последнее время более всего приглянулся пресет "TemporalCleaner_LS_MT.avs". Он сочетает в себе хорошее качество видео с отличным быстродействием (вчера кодировал новую "Обитель зла". Первый проход ~45 мин., второй - час с небольшим.) Но в бассейне меда имеется капелька дёгтя... Когда видео уходит в темноту (типа, при завершении сцены, fade out), то на этой темноте остаются артефакты движущихся в кадре светлых элементов. В результате темнота получается не развомерно темной, а с пятнами от этих артефактов.

Хочу спросить: можно ли побороть этот негативный момент? Может что-нибудь "подкрутить" в пресете?

И еще маленький вопрос. Вчера же скачал DVD фильма "Dellamorte Dellamore (Director's Cut) (1994)" (IMHO, чистой воды шедевр). Хочу его закодировать в Xvid. Но при просмотре исходника я увидел, что картинка очень шумная (роящиеся мелкие "мошки", очень мелкие). Некоторым это нравится, но мне - не очень. К тому же, эти "мошки" отгрызут немало битрейта. А не хотелось бы.

Каким пресетом (или, наверное, стоит попробовать несколько) лучше обрабатывать подобный исходный материал? Ведь это типичная ситуация, наверное, она решается на-раз. Прошу помочь советом :-)

Большое спасибо за помощь!

P.S. Закодировал-таки этот фильм с пресетом из этого поста (первым, который медленный). Скорость кодирования составила 5-6 кадров. Качество получилось очень хорошее! Но я столкнулся с одним незнакомым мне эффектом. Я во втором проходе приклеивал звуковые дорожки к выходному файлу. К моему большому удивлению файл при воспроизведении стал дергаться, как это бывает из-за неправильного iVTC. Раньше я с таким дефектом не сталкивался. Поэтому, поразмыслив, я выделил отдельно только видео. Затем с помощью VirtualDubMod-а снова склеил видео со звуковыми дорожками. Все стало хорошо.

По всей видимости, такой эффект возник из-за того, что весьма медленное кодирование вызвало нарушение синхронизации видео и звука. Удивительное дело, это кодирование... :-)

P.P.S. А в этом пресете нет пятен (артефактов) в темных местах. Эх, был бы он раза в два-три шустрее...

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

СообщениеДобавлено: Пн окт 11, 2010 3:35 pm
Tempter57
Пресеты, содержащие векторный анализ все медленные, но весьма эффективные. Можно вместо DVD Twister Sharpen применить такой:
Код: Выделить всё
#plugin_files
#RemoveGrainSSE2.dll
#RepairSSE2.dll
#mvtools2.dll
#mt_masktools-25.dll
#MT.dll
#EEDI2.dll
#AddGrainC.dll
#GradFun2DB.dll
#Gradfun2dbmod.avs
#EEDI2AA.avs
#Ylevels.avs


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
sharp = source.mt_adddiff(mt_makediff(source,source.removegrain(4)),U=2,V=2) # "median sharpen" (won't create halos on its own, IF the source is halo-free)
source_super = source.MSuper(pel=2, sharp=1, rfilter=2)
sharp_super = sharp.MSuper(pel=2, sharp=1, levels=1)
b1v = MAnalyse(source_super, isb=true, truemotion=true, delta=1, overlap=4)
f1v = MAnalyse(source_super,isb=false, truemotion=true, delta=1, overlap=4)
cf1 = MCompensate(source, sharp_super, f1v)
cb1 = MCompensate(source, sharp_super, b1v)
max = mt_logic(cb1,cf1,"max").mt_logic(source,"max")
min = mt_logic(cb1,cf1,"min").mt_logic(source,"min")
sharp1 = source.sharpen(0.4).mergechroma(last)
sharp1.mt_clamp(max,min,0,0,U=2,V=2)

super = MSuper(pel=2,sharp=2)
bv2 = MAnalyse(super, isb = true, truemotion=false, delta=2, blksize =16, overlap=4)
bv1 = MAnalyse(super, isb = true, truemotion=false, delta=1, blksize =16, overlap=4)
fv1 = MAnalyse(super,isb = false, truemotion=false, delta=1, blksize =16, overlap=4)
fv2 = MAnalyse(super,isb = false, truemotion=false, delta=2, blksize =16, overlap=4)
MDegrain2(super, bv1,fv1,bv2,fv2,thSAD=256)
EEDI2AA()
Gradfun2dbmod(thr=1.4,thrC=1.8,str=0.6,temp=90,adapt=64)
YlevelsS(0,1.0,255,0,255,false)
""",threads=2,overlap=16,splitvertical=false) # or threads=4

Он по скорости обработки будет по-выше. А по поводу артефактов при кодировании XviD на ключевых кадрах при смене сцен фильтром TemporalCleaner LS MT могу сказать, что это характерно практически для всех пресетов без векторного анализа. Можно попробовать в этом плане скрипт LEM (mask Luma, mask Edge+mask Motion). Изображение после шумодава и изображение после шарпера накладывается посредством суммарной маски на исходник source:
Код: Выделить всё
#plugin_files
#RemoveGrainSSE2.dll
#RepairSSE2.dll
#MSharpen.dll
#mvtools2.dll
#Warpsharp.dll
#mt_masktools-25.dll
#MT.dll
#dfttest.dll
#hqdn3d.dll
#Ylevels.avs
#LEM.avs
#LimitedSharpenFaster Mod.avs


setmemorymax(512)

MT("""
#LEM(ff="dfttest(sigma=16,ftype=1,tbsize=5)",flem="LSFmod(strength=90,Smode=5,Smethod=3,Lmode=0,overshoot=0,ss_x=1.50,ss_y=1.50)",mode="LEM")
LEM(ff="hqdn3d(4,3,5,4)",flem="LSFmod(strength=100,Smode=3,Smethod=3,ss_x=1.75,ss_y=1.75)",mode="LEM")
YlevelsS(0,1.0,255,0,255,false)
""",threads=2,overlap=16,splitvertical=false) # or threads=4

# ====================================================
# 16/05/2007 by superqix
#ie use:
#LEM(ff="hqdn3d()",flem="LSFMOD()",mode="LEM")
#
#ff= function/filter that as be applied to "low importance zone"
#flem= function/filter that as be applied to "high importance zone"
#mode = "l" luma
#mode = "e" Edge 
#mode = "m" Motion
#nn()= function for no processing.
#ie yellow zones are ff...

function LEM( clip c, string "ff", string "flem", string "mode", 
\ int "th_low_luma", int "th_high_luma", int "th_motion", int "bl_sz_motion", int "th_edge" ){

mode=default(mode,"LEM")
th_low_luma = default( th_low_luma, 60)
th_high_luma = default( th_high_luma, 120)
th_edge = default( th_edge, 4)
bl_sz_motion = default( bl_sz_motion, 8)
th_motion = default( th_motion, 16)

c_ff   = Eval("c." + ff   )
c_flem = Eval("c." + flem )
m_lem  = mask_lem(c,mode,th_low_luma,th_high_luma,th_motion,bl_sz_motion,th_edge)

return mt_merge(c_ff , c_flem, m_lem , luma=true)
}

# ================================================

function mask_low_luma (clip i, int l1_th){return mt_binarize(i, threshold = l1_th).mt_invert()}
function mask_high_luma(clip i, int l2_th){return mt_binarize(i, threshold = l2_th)}

function mask_motion(clip i, int m_th, int bl_sz){
global i_eval=i
super    = i.MSuper()
  v= MAnalyse(super, blksize=bl_sz)
return MMask(super, v, ml=m_th, kind=1)
}
   
Function mask_edge(clip i, int e_th){return i.Msharpen(threshold=e_th,mask=true)}

function mask_lem(clip i, string mode,  int l1_th, int l2_th, int m_th, int bl_sz, int e_th){
   Lenable = FindStr(UCase(mode),"L")
   Eenable = FindStr(UCase(mode),"E")
   Menable = FindStr(UCase(mode),"M")
   L   = mt_logic( mask_low_luma(i,l1_th).mt_deflate() , mask_high_luma(i,l2_th).mt_deflate() , "or" ).mt_invert()
   E   = mask_edge(i,e_th).mt_deflate().mt_deflate()
   M   = mask_motion(i, m_th, bl_sz).mt_invert()
   LE  = ( Lenable > 0 && Eenable > 0) ? mt_logic( L,E,"or") : ( Lenable > 0 ) ? L : ( Eenable > 0 ) ? E : M
   LEM = ( Menable > 0 ) ? mt_logic(LE,M,"and") : LE
return LEM}

function nn(clip u){return u}

Теперь по поводу чем убрать высокочастотный шум: общая рекомендация это fft3dfilter c обязательным заданием всез значений сигм: sigma=3, sigma2=1.2, sigma3=0.1, sigma4=0.1. Это позволит срезать только высокочастотный шум. На мой взгляд -это в корне не верно, поскольку подобный шум разбивает градиенты цветовых переходов и улучшает детализацию изображения. Другое дело, что этот динамический шум можно подменить на статический, на который гораздо меньше расходуется битрейт. Делается это ,например, задав temp=100 в параметрах скрипта Gradfun2dbmod.avs

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

СообщениеДобавлено: Пн окт 11, 2010 11:11 pm
jur
Большое спасибо! Буду пробовать.

P.S. Пресет N 6 ну очень хорош! (Не знаю, как их назвать... Первый пресет из предыдущего поста у меня назван "Preset_6". Может стоит присвоить им названия?) По моему даже лучше пресета N 4 (тот, который медленный). Пресет 4 дает больше резкости, но пресет 6, IMHO, лучше прорабатывает детали.

Что касается быстродействия, то пресет 6 на "почти полтора часа" быстрее :-) Т.е. кодирование пресетом 4 занимает 7 с половиной часов на проход, а пресет 6 - 6 часов с небольшим.

P.P.S. Может быть стоит мне оформить отдельный топик с результатами моих исследований? Ведь таким начинающим, как я, подобная информация может быть очень полезна. Но в таком случае, наверное, стоило бы назвать пресеты по имени файлов, в которых они хранятся. Уважаемый коллега, если моя мысль покажется разумной, поназывай их пожалуйста :-)

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

СообщениеДобавлено: Чт окт 14, 2010 1:22 pm
jur
Tempter57

Уважаемый коллега, катастрофа! Прошу помощи!

Пресет N 6 мне ну очень понравился. Начал его пробовать на разных материалах. И вдруг на файле "Зеркала 2" натыкаюсь на дефект. Проиллюстрирую свои слова скриншотами. Кодирование велось с помощью Avisynth в программе VirtualDubMod.

Вот исходный кадр:
Изображение

Вот кадр, обработанный пресетом 4:
Изображение

А этот кадр, обработан пресетом 6:
Изображение

В левой части мы видим окно с деревянными ставнями-жалюзи. На первых двух кадрах отдельные полоски хорошо видны, а на последнем - половина полосок на дверце сильно замазана! Это хорошо заметно как при предварительном просмотре (в программах VirtualDubMod и AvsP), так и в окончательно закодированном файле. Пожалуйста, подскажите, как побороть этот дефект! Больно уж хорош пресет N 6, очень хотелось бы им пользоваться!

Большое спасибо за помощь!

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

СообщениеДобавлено: Чт окт 14, 2010 3:08 pm
Tempter57
я скрипт чуточку подправил, попробуйте MDegrain2 с другой парой векторов, предудущая пара была смешанной с разных векторных анализов для увеличения скорости обработки.
Как вариант пробуйте закрывать строки в скрипте EEDI2AA() и Gradfun2dbmod

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

СообщениеДобавлено: Чт окт 14, 2010 7:18 pm
jur
Огромное спасибо уважаемый Tempter57! Работает!

Вот мои наблюдения:

1. Отличия в тестовом кадре при старом варианте пресета:
Код: Выделить всё
bv2 = MAnalyse(super, isb = true, truemotion=false, delta=2, blksize =16, overlap=4)
#b1v = MAnalyse(super, isb = true, truemotion=false, delta=1, blksize =16, overlap=4)
#f1v = MAnalyse(super,isb = false, truemotion=false, delta=1, blksize =16, overlap=4)
fv2 = MAnalyse(super,isb = false, truemotion=false, delta=2, blksize =16, overlap=4)

и при новом:
Код: Выделить всё
bv2 = MAnalyse(super, isb = true, truemotion=false, delta=2, blksize =16, overlap=4)
bv1 = MAnalyse(super, isb = true, truemotion=false, delta=1, blksize =16, overlap=4)
fv1 = MAnalyse(super,isb = false, truemotion=false, delta=1, blksize =16, overlap=4)
fv2 = MAnalyse(super,isb = false, truemotion=false, delta=2, blksize =16, overlap=4)

очень малозаметны, практически не видны. Как эти вектора влияют на видео? Может быть в некоторых случаях стоит применять хоть и более медленный, но более правильный вариант с четырьмя векторами?

2. Вопрос с замыливанием полностью решается удалением вот этой строки:
Код: Выделить всё
#~ EEDI2AA()

Ее удаление не вызовет появления каких-нибудь подводных камней?

3. Наличие или отсутствие функции:
Код: Выделить всё
Gradfun2dbmod(thr=1.4,thrC=1.8,str=0.6,temp=90,adapt=64)

никак не сказывается на картинке. Может это будет заметно в динамике и ее все-таки следует оставить?

Большое спасибо за помощь!

P.S. Произвел некоторые замеры. Получил следующие результаты.

- Пресет 6 с двумя векторами без функций "EEDI2AA()" и "Gradfun2dbmod()" - скорость примерно 30 fps.
- Пресет 6 с четырьмя векторами без функций "EEDI2AA()" и "Gradfun2dbmod()" - скорость примерно 14 fps.
- Пресет 6 с четырьмя векторами без функции "EEDI2AA()" - скорость примерно 9 fps.

Таким образом вопросы 1 и 3 становятся весьма актуальными. Следует ли все-таки применять 4 вектора? И следует ли использовать функцию "Gradfun2dbmod()"? Какие показания к применению одного и другого?

Спасибо!

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

СообщениеДобавлено: Чт окт 14, 2010 11:46 pm
Tempter57
В принципе так называемый скрипт №6 был предназначен для обработки интерлейсного аниме и после деинтерлейса шёл данный скрипт. Поэтому функции
Код: Выделить всё
EEDI2AA() # антиайлизинг
Gradfun2dbmod(thr=1.4,thrC=1.8,str=0.3,mode=2,temp=100,adapt=64) # DeBanding для удаление градиента цветовых переходов

были предназначены в большей степени для аниме и при обработке movie их применение необязательно.

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

СообщениеДобавлено: Пт окт 15, 2010 1:39 am
jur
Понял, большое спасибо за информацию!

А как насчет векторов? В чем их предназначение? Нужны ли все четыре, или достаточно только двух, как в первом варианте?

А вообще скрипт совершенно выдающийся! :-) Большое спасибо!