Advertisement
Zastin

excessively limited denoiser

Jun 8th, 2020 (edited)
259
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
Python 4.98 KB | None | 0 0
  1. def denoise_but_actually_dont(clip, degrain_tr=3, degrain_thsad=100,
  2.                               comp_tr=3, comp_thsad=200, comp_blur=11,
  3.                               recalc_thsad=None, truemotion=False, search=4, trymany=False,
  4.                               sigma=0, radius1=1, psample=0,
  5.                               mask=None, repair=13,
  6.                               sharp=False, sharp_str=1, sharp_pre=0, sharp_merge=1, sharp_limit=None,
  7.                               limit_thr=0, limit_elast=2.,
  8.                               blur_rad=None, median_rad=None, sbr_rad=None, rgmode=21,
  9.                               s0=1., c=0.0625):
  10.     core = vs.core
  11.    
  12.     comp_tr = min(comp_tr, 12)
  13.     tr = max(degrain_tr, comp_tr)
  14.     isHD = 1 if clip.width >= 1100 or clip.height >= 600 else 0
  15.    
  16.     recalc_thsad = fallback(recalc_thsad, [degrain_thsad / x for x in (2,4,8)])
  17.    
  18.     if isinstance(recalc_thsad, list):
  19.         while len(recalc_thsad) < 3:
  20.             recalc_thsad.append(recalc_thsad[-1])
  21.     else:
  22.         recalc_thsad = [recalc_thsad] * 3
  23.    
  24.     blur_rad = fallback(blur_rad, [1,2][isHD])
  25.     median_rad = fallback(median_rad, [1,2][isHD])
  26.     sbr_rad = fallback(sbr_rad, [1,2][isHD])
  27.    
  28.     clipsf = core.resize.Point(clip, format=vs.GRAYS)
  29.     clip = core.resize.Point(clip, format=vs.GRAY16)
  30.    
  31.     if mask:
  32.         if isinstance(mask, list):
  33.             while len(mask) < 2:
  34.                 mask.append(mask[-1])
  35.         else:
  36.             mask = [mask] * 2
  37.         emask = core.std.Prewitt(clipsf)
  38.         emask = amp_mask(emask, mask[0], mask[1])
  39.         emask = core.rgsf.RemoveGrain(emask, [11,20][isHD])
  40.    
  41.     if sigma:
  42.         smooth = mvf.BM3D(clip, sigma=sigma, radius1=radius1, psample=psample)
  43.     else:
  44.         smooth = dfttest_prefilter(clip)
  45.    
  46.     pre_b = core.std.Convolution(clip, [1]*9) if 1 < blur_rad < 2 else core.rgvs.RemoveGrain(clip, 11)
  47.     if blur_rad >= 2:
  48.         for _ in range(blur_rad - 1):
  49.             pre_b = core.std.Convolution(pre_b, [1]*9)
  50.     pre_m = core.std.Median(clip) if median_rad is 1 else core.ctmf.CTMF(clip, radius=median_rad)
  51.     pre_s = haf.sbr(clip, r=sbr_rad)
  52.     pre_r = core.rgvs.RemoveGrain(clip, rgmode)
  53.    
  54.     pre = [MMFilter([clip, smooth, pre_b])]
  55.     pre+= [MMFilter([clip, pre[0], pre_m])]
  56.     pre+= [MMFilter([clip, pre[1], pre_s])]
  57.     pre+= [MMFilter([clip, pre[2], pre_r])]
  58.    
  59.     pre = [DLRmod(preclip, s0, c) for preclip in pre]
  60.    
  61.     asup = core.mvsf.Super(pre[3], 16, 16, 1, 0, rfilter=4)
  62.     rsupa= core.mvsf.Super(pre[2], 16, 16, 1, 1)
  63.     rsupb= core.mvsf.Super(pre[1], 16, 16, 1, 1)
  64.     rsupc= core.mvsf.Super(pre[0], 16, 16, 1, 1)
  65.     dsup = core.mvsf.Super(clipsf, 16, 16, 1, 1)
  66.    
  67.     vec = mv.Analyse(asup, blksize=16, search=search, tr=tr, truemotion=truemotion, overlap=8, trymany=trymany)
  68.     vec = mv.Recalculate(rsupa, vec, thsad=recalc_thsad[0], blksize=8, search=search, truemotion=truemotion, overlap=4, tr=tr, interleave=False)
  69.     vec = mv.Recalculate(rsupb, vec, thsad=recalc_thsad[1], blksize=4, search=search, truemotion=truemotion, overlap=2, tr=tr, interleave=False)
  70.     vec = mv.Recalculate(rsupb, vec, thsad=recalc_thsad[2], blksize=4, search=search, truemotion=truemotion, overlap=2, tr=tr, interleave=False)
  71.    
  72.     degrain_vec_start = tr - degrain_tr
  73.     degrain_vec_end = degrain_tr * 2 + degrain_vec_start
  74.     degrain_vec = vec[degrain_vec_start:degrain_vec_end]
  75.     clean = mv.DegrainN(clipsf, dsup, degrain_vec, tr=degrain_tr, thsad=degrain_thsad)
  76.    
  77.     if sigma:
  78.         clean = MMFilter([clipsf, clean, core.resize.Point(bm3d, format=vs.GRAYS)])
  79.     if sharp:
  80.         clean = csharpmod(clean, clipsf, strength=sharp_str, prefilter=sharp_pre, darkened_merge=sharp_merge, brightened_merge=sharp_merge, darkening_limit=sharp_limit, brightening_limit=sharp_limit)
  81.     if limit_thr:
  82.         clean = LimitFilter(clean, clipsf, thr=limit_thr/219, elast=elast, mode=0)
  83.     if mask:
  84.         clean = core.std.MaskedMerge(clean, clipsf, emask)
  85.     if repair:
  86.         clean = core.rgsf.Repair(clean, clipsf, repair)
  87.    
  88.     grain = core.std.MakeDiff(clipsf, clean)
  89.    
  90.     gsup = core.mvsf.Super(grain, 16, 16, 1, 1)
  91.    
  92.     comp_vec_start = tr - comp_tr
  93.     comp_vec_end = comp_tr * 2 + comp_vec_start
  94.     comp_vec = vec[comp_vec_start:comp_vec_end]
  95.     comp = mv.Compensate(grain, gsup, comp_vec, thsad=comp_thsad, tr=comp_tr, interleave=False)
  96.    
  97.     vlen = comp_tr * 2 + 1
  98.    
  99.     abc = [f' {x} ' for x in 'xyzabcdefghijklmnopqrstuv'][:vlen]
  100.     add = [' + '] * (vlen - 1)
  101.     count = vlen
  102.    
  103.     if comp_blur in (11, 12):
  104.         count = 2
  105.         for x in range(1, vlen - 1):
  106.             weight = 1 << ( comp_tr - abs( x - comp_tr ) )
  107.             abc[x] += f' {weight} * '
  108.             count += weight
  109.    
  110.     divisor = [f' {count} / ']
  111.    
  112.     expr = ''.join(abc + add + divisor)
  113.    
  114.     grain = core.std.Expr(comp, expr)
  115.    
  116.     stable = core.std.MergeDiff(clean, grain)
  117.    
  118.     return MMFilter([clip,clean,stable])
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement