STJAM
12th November 2022, 23:25
Several years ago when I transitioned from Avisynth to Vapoursynth I missed several of the scripts that I sometimes used like zzz denoise. I tried to adapt ZZZ Denoise but was never happy with the result. I dug it back up because someone in Avisynth usage was looking for a Masked Spatial-Temporal denoiser and this came to mind although this is probably not what they had in mind. Has someone have a similar script or possibly improve on what is below.
def zzz_denoise (clip, sigma=16, mask=False, scale=30, thsad=200):
core = vs.get_core()
filter = core.ttmpsm.TTempSmooth(clip)
pre = core.rgvs.RemoveGrain(filter, 12)
super = clip.mv.Super(levels=1)
super_a = pre.mv.Super()
fwd_vect_3 = core.mv.Analyse(super_a, isb=False, delta=3, overlap=4)
fwd_vect_2 = core.mv.Analyse(super_a, isb=False, delta=2, overlap=4)
fwd_vect_1 = core.mv.Analyse(super_a, isb=False, delta=1, overlap=4)
bck_vect_1 = core.mv.Analyse(super_a, isb=True, delta=1, overlap=4)
bck_vect_2 = core.mv.Analyse(super_a, isb=True, delta=2, overlap=4)
bck_vect_3 = core.mv.Analyse(super_a, isb=True, delta=3, overlap=4)
fwd_comp_2 = core.mv.Compensate(clip, super, fwd_vect_2, thsad=thsad)
fwd_comp_1 = core.mv.Compensate(clip, super, fwd_vect_1, thsad=thsad)
bck_comp_1 = core.mv.Compensate(clip, super, bck_vect_1, thsad=thsad)
bck_comp_2 = core.mv.Compensate(clip, super, bck_vect_2, thsad=thsad)
interleaved = core.std.Interleave([fwd_comp_2, fwd_comp_1, clip, bck_comp_1, bck_comp_2])
c_dft = core.dfttest.DFTTest(interleaved, sigma=sigma)
c_dft = core.std.SelectEvery(c_dft,5,2)
c_deg = core.mv.Degrain3 (clip, super, bck_vect_1, fwd_vect_1, bck_vect_2, fwd_vect_2, bck_vect_3, fwd_vect_3, thsad=thsad)
edge_mask = core.std.Prewitt(c_deg, scale=scale)
edge_mask = hf.mt_expand_multi(edge_mask)
#edge_mask = hf.mt_inflate_multi(edge_mask)
#edge_mask = core.std.Maximum(edge_mask)
v_em = core.std.ShufflePlanes(edge_mask,0,vs.GRAY)
c_hyb = core.std.MaskedMerge(c_dft, c_deg, mask=edge_mask, planes=[0,1,2])
if mask:
return v_em
else:
return c_hyb
def zzz_denoise (clip, sigma=16, mask=False, scale=30, thsad=200):
core = vs.get_core()
filter = core.ttmpsm.TTempSmooth(clip)
pre = core.rgvs.RemoveGrain(filter, 12)
super = clip.mv.Super(levels=1)
super_a = pre.mv.Super()
fwd_vect_3 = core.mv.Analyse(super_a, isb=False, delta=3, overlap=4)
fwd_vect_2 = core.mv.Analyse(super_a, isb=False, delta=2, overlap=4)
fwd_vect_1 = core.mv.Analyse(super_a, isb=False, delta=1, overlap=4)
bck_vect_1 = core.mv.Analyse(super_a, isb=True, delta=1, overlap=4)
bck_vect_2 = core.mv.Analyse(super_a, isb=True, delta=2, overlap=4)
bck_vect_3 = core.mv.Analyse(super_a, isb=True, delta=3, overlap=4)
fwd_comp_2 = core.mv.Compensate(clip, super, fwd_vect_2, thsad=thsad)
fwd_comp_1 = core.mv.Compensate(clip, super, fwd_vect_1, thsad=thsad)
bck_comp_1 = core.mv.Compensate(clip, super, bck_vect_1, thsad=thsad)
bck_comp_2 = core.mv.Compensate(clip, super, bck_vect_2, thsad=thsad)
interleaved = core.std.Interleave([fwd_comp_2, fwd_comp_1, clip, bck_comp_1, bck_comp_2])
c_dft = core.dfttest.DFTTest(interleaved, sigma=sigma)
c_dft = core.std.SelectEvery(c_dft,5,2)
c_deg = core.mv.Degrain3 (clip, super, bck_vect_1, fwd_vect_1, bck_vect_2, fwd_vect_2, bck_vect_3, fwd_vect_3, thsad=thsad)
edge_mask = core.std.Prewitt(c_deg, scale=scale)
edge_mask = hf.mt_expand_multi(edge_mask)
#edge_mask = hf.mt_inflate_multi(edge_mask)
#edge_mask = core.std.Maximum(edge_mask)
v_em = core.std.ShufflePlanes(edge_mask,0,vs.GRAY)
c_hyb = core.std.MaskedMerge(c_dft, c_deg, mask=edge_mask, planes=[0,1,2])
if mask:
return v_em
else:
return c_hyb