Log in

View Full Version : ZZZ Denoise


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

Setsugen no ao
15th November 2022, 16:53
from typing import Any

from vsdenoise import MVTools
from vsmask.util import expand
from vsrgtools import RemoveGrainMode, removegrain
from vstools import core, get_y, vs


def zzz_denoise(
clip: vs.VideoNode, sigma: int = 16,
tr: int = 3, thSAD: int = 200, overlap: int = 4, refine: int = 0,
scale: int = 30, show_mask: bool = False, **kwargs: Any
) -> vs.VideoNode:
if 'prefilter' not in kwargs:
kwargs.update(prefilter=removegrain(clip.ttmpsm.TTempSmooth(), RemoveGrainMode.OPP_CLIP_AVG_FAST))

mv = MVTools(clip, tr, refine, overlap=overlap, **kwargs)

c_dft = mv.compensate(core.dfttest.DFTTest, thSAD, sigma=sigma, tbsize=mv.tr + 2)
c_deg = mv.degrain(thSAD)

edge_mask = get_y(c_deg).std.Prewitt(scale=scale)
edge_mask = expand(edge_mask, 1)

if show_mask:
return edge_mask

return c_dft.std.MaskedMerge(c_deg, edge_mask)

STJAM
19th November 2022, 15:17
Python exception: cannot import name 'KwargsNotNone' from 'vstools'

_Al_
19th November 2022, 18:02
It looks like vstools is a package that needs to be installed.
In your script it is not a problem to not to use it:
instead of:
from vstools import core, get_y, vs
use:
import vapoursynth as vs
from vapoursynth import core
and instead of:
edge_mask = get_y(c_deg).std.Prewitt(scale=scale)
use:
edge_mask = c_deg.std.SplitPlanes()[0].std.Prewitt(scale=scale)
SplitPlanes() was introduced lately, if having old vapoursynth version use:
edge_mask = c_deg.std.ShufflePlanes(planes=[0], colorfamily=vs.GRAY).std.Prewitt(scale=scale)

Selur
19th November 2022, 19:51
vsdenoise, vsmask, vsrgtools, vstools are all stuff from https://github.com/Irrational-Encoding-Wizardry that would need to be installed.
(didn't check what are the dependencies of those)

STJAM
19th November 2022, 21:06
Thanks, _AI_ you provided me with what I needed to fix my original script and thank you Selur. I thought I had installed the required packages but I guess not. I am new to pip and I presume I did something wrong.