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

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

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

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

Сообщение Gromozeka » Пн май 24, 2010 4:00 pm

Tempter57
Безусловно мой скрипт я писал для своих задач и чесно говоря с синтаксисом у меня проблемы, поэтому себя не назову скриптописателем, но проводил всякие опыты, этот меня устроил.
по поводу фильтра столяревского сергея по шумоподавлению цветового шума - тоже полностью согласен и я его использую. помоему это лучший фильтр из тех что я знаю - очень хорошо сохраняет детали и так далее
Gromozeka
Капитан-Лейтенант
Капитан-Лейтенант
 
Сообщения: 925
Зарегистрирован: Пт мар 10, 2006 3:45 pm

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

Сообщение Tempter57 » Чт июн 10, 2010 6:59 pm

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 по умолчанию: включен
# Скорость обработки: медленная
Последний раз редактировалось Tempter57 Вс июл 25, 2010 7:16 pm, всего редактировалось 6 раз(а).
Tempter57
Старшина 2ой статьи
Старшина 2ой статьи
 
Сообщения: 105
Зарегистрирован: Пт янв 23, 2009 3:43 am
Откуда: г.Донецк

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

Сообщение Gideon Vi » Чт июн 10, 2010 7:28 pm

Tempter57, спасибо за информацию. На Ваш взгляд он лучше LSFmod?
Now we that are strong ought to
bear the infirmities of the weak
and not to please ourselves.
Gideon Vi
Капитан-Лейтенант
Капитан-Лейтенант
 
Сообщения: 803
Зарегистрирован: Ср июл 20, 2005 7:10 pm

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

Сообщение Tempter57 » Пт июн 11, 2010 8:26 am

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. В результате мы получаем различные решения и подход в этом вопросе, что не может не радовать.
Tempter57
Старшина 2ой статьи
Старшина 2ой статьи
 
Сообщения: 105
Зарегистрирован: Пт янв 23, 2009 3:43 am
Откуда: г.Донецк

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

Сообщение Gideon Vi » Сб июн 19, 2010 4:52 am

Tempter57, спасибо за информацию
Now we that are strong ought to
bear the infirmities of the weak
and not to please ourselves.
Gideon Vi
Капитан-Лейтенант
Капитан-Лейтенант
 
Сообщения: 803
Зарегистрирован: Ср июл 20, 2005 7:10 pm

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

Сообщение Tempter57 » Пн июл 19, 2010 8:56 pm

Отредактировал и обновил архив plugins_filtering для XviD 4PSP 5.0.37.8. Сильно изменились пресеты аниме, обновлены все плагины. На такие изменения в обработке аниме сподвигли результаты методов подавление ореолов, описанные в ветке Halo killings и в частности работы Виталия Горбатенко по обработке аниме и скрипт DeHalo_2 от Didйе.
Tempter57
Старшина 2ой статьи
Старшина 2ой статьи
 
Сообщения: 105
Зарегистрирован: Пт янв 23, 2009 3:43 am
Откуда: г.Донецк

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

Сообщение Gideon Vi » Вс авг 22, 2010 6:28 am

Отредактировал и обновил архив plugins_filtering для XviD 4PSP 5.0.37.8

на данный момент более свежего пакета нет?
Now we that are strong ought to
bear the infirmities of the weak
and not to please ourselves.
Gideon Vi
Капитан-Лейтенант
Капитан-Лейтенант
 
Сообщения: 803
Зарегистрирован: Ср июл 20, 2005 7:10 pm

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

Сообщение jur » Вс сен 12, 2010 6:42 pm

Tempter57, большое спасибо за твой опыт! Я был совершенно поражен результатами, показанными в этом посте! Но все никак не мог постичь, как же использовать этот сложный для понимания код :-) Я ведь совершенный новичок в этих не простых вопросах. И вот сегодня я собрался с духом и попробовал. Полнейший восторг! Еще раз огромное спасибо за науку!
MPEG-4 - в массы!
jur
Матрос
Матрос
 
Сообщения: 34
Зарегистрирован: Пн ноя 20, 2006 1:11 pm

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

Сообщение Tempter57 » Пт сен 17, 2010 10:12 pm

Попробуйте ещё такие два пресета, думаю восторг будет по-лучше:
Код: Выделить всё
#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) # удаление радужности и цветового шума
Tempter57
Старшина 2ой статьи
Старшина 2ой статьи
 
Сообщения: 105
Зарегистрирован: Пт янв 23, 2009 3:43 am
Откуда: г.Донецк

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

Сообщение jur » Пт сен 17, 2010 11:07 pm

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 явится совершенно незаменимым путеводителем для таких, не умудренных глубинными знаниями, простых рипперов, как я :-)

Что скажете, уважаемые коллеги?
MPEG-4 - в массы!
jur
Матрос
Матрос
 
Сообщения: 34
Зарегистрирован: Пн ноя 20, 2006 1:11 pm

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

Сообщение LrRaiden » Вс сен 19, 2010 2:31 am

посоветуйте шумодав для БД-рипа, сам филм анимационный снят ещё 84 году, хочу избавится от мелкого яркостного шума.
LrRaiden
Юнга
 
Сообщения: 23
Зарегистрирован: Сб апр 25, 2009 12:23 am
Откуда: С-Пб.

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

Сообщение Tempter57 » Пн сен 20, 2010 1:33 am

Приблизительно такой скрипт для аниме высокого разрешения:
Код: Выделить всё
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)

Надеюсь, остальные плагины у вас есть, если чего не хватает,- скачайте мой архив выше.
Tempter57
Старшина 2ой статьи
Старшина 2ой статьи
 
Сообщения: 105
Зарегистрирован: Пт янв 23, 2009 3:43 am
Откуда: г.Донецк

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

Сообщение jur » Сб окт 09, 2010 5:41 pm

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. А в этом пресете нет пятен (артефактов) в темных местах. Эх, был бы он раза в два-три шустрее...
MPEG-4 - в массы!
jur
Матрос
Матрос
 
Сообщения: 34
Зарегистрирован: Пн ноя 20, 2006 1:11 pm

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

Сообщение Tempter57 » Пн окт 11, 2010 3:35 pm

Пресеты, содержащие векторный анализ все медленные, но весьма эффективные. Можно вместо 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
Последний раз редактировалось Tempter57 Чт окт 14, 2010 3:23 pm, всего редактировалось 2 раз(а).
Tempter57
Старшина 2ой статьи
Старшина 2ой статьи
 
Сообщения: 105
Зарегистрирован: Пт янв 23, 2009 3:43 am
Откуда: г.Донецк

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

Сообщение jur » Пн окт 11, 2010 11:11 pm

Большое спасибо! Буду пробовать.

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

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

P.P.S. Может быть стоит мне оформить отдельный топик с результатами моих исследований? Ведь таким начинающим, как я, подобная информация может быть очень полезна. Но в таком случае, наверное, стоило бы назвать пресеты по имени файлов, в которых они хранятся. Уважаемый коллега, если моя мысль покажется разумной, поназывай их пожалуйста :-)
MPEG-4 - в массы!
jur
Матрос
Матрос
 
Сообщения: 34
Зарегистрирован: Пн ноя 20, 2006 1:11 pm

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

Сообщение jur » Чт окт 14, 2010 1:22 pm

Tempter57

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

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

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

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

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

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

Большое спасибо за помощь!
MPEG-4 - в массы!
jur
Матрос
Матрос
 
Сообщения: 34
Зарегистрирован: Пн ноя 20, 2006 1:11 pm

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

Сообщение Tempter57 » Чт окт 14, 2010 3:08 pm

я скрипт чуточку подправил, попробуйте MDegrain2 с другой парой векторов, предудущая пара была смешанной с разных векторных анализов для увеличения скорости обработки.
Как вариант пробуйте закрывать строки в скрипте EEDI2AA() и Gradfun2dbmod
Tempter57
Старшина 2ой статьи
Старшина 2ой статьи
 
Сообщения: 105
Зарегистрирован: Пт янв 23, 2009 3:43 am
Откуда: г.Донецк

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

Сообщение jur » Чт окт 14, 2010 7:18 pm

Огромное спасибо уважаемый 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()"? Какие показания к применению одного и другого?

Спасибо!
MPEG-4 - в массы!
jur
Матрос
Матрос
 
Сообщения: 34
Зарегистрирован: Пн ноя 20, 2006 1:11 pm

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

Сообщение Tempter57 » Чт окт 14, 2010 11:46 pm

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

были предназначены в большей степени для аниме и при обработке movie их применение необязательно.
Tempter57
Старшина 2ой статьи
Старшина 2ой статьи
 
Сообщения: 105
Зарегистрирован: Пт янв 23, 2009 3:43 am
Откуда: г.Донецк

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

Сообщение jur » Пт окт 15, 2010 1:39 am

Понял, большое спасибо за информацию!

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

А вообще скрипт совершенно выдающийся! :-) Большое спасибо!
MPEG-4 - в массы!
jur
Матрос
Матрос
 
Сообщения: 34
Зарегистрирован: Пн ноя 20, 2006 1:11 pm

Пред.След.

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

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

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

cron