Eigentlich kann man QTGMC durchaus kontrollieren, wie die Grain-Retention ist.
Insbesondere wenn man noch die Parameter dazu nimmt, die nicht in der GUI sind, hat man eigentlich recht gute Kontrolle,...
Hier mal die Parameter, die es gibt:
und welche direkt durch die Presets abgedeckt werden
Quelle: https://github.com/Selur/VapoursynthScri...avsfunc.py
QTGMC ist ja gerade ein Skript, was viele Parameter und Presets hat, damit auch ohne die Syntax voll zu verstehen brauchbar deinterlacen kann.
Zu BWDIF:
Quelle: https://github.com/HomeOfVapourSynthEvol...ynth-Bwdif
Bei YadifMode wird einfach:
verwendet. (field=X in NNEDI3 ist nicht der gleiche field-Wert wie bei YadifMod, glaube bei BWDIF sind sie gleich)
Was znedi3 kann, kannst Du bei https://github.com/sekrit-twc/znedi3 sehen.
Was NNEDI3CL kann, kannst Du bei https://github.com/HomeOfVapourSynthEvol...h-NNEDI3CL sehen.
Was EEDI3 bzw. EEDI3CL kann, kannst Du bei https://github.com/HomeOfVapourSynthEvol...ynth-EEDI3 sehen.
in durchaus bereit in BWDIF Elemente hinzufügen, um den edeint-Parameter zu nutzen, brauch aber mehr Details, da ich selber BWDIF nicht nutze.
Wenn Du mir (!genau!) sagen kannst, was für Parameter mit welchen Werten unterstützt werden sollen und was da für Code entstehen muss, kann ich da was für schreiben.
Cu Selur
Insbesondere wenn man noch die Parameter dazu nimmt, die nicht in der GUI sind, hat man eigentlich recht gute Kontrolle,...
Hier mal die Parameter, die es gibt:
def QTGMC(
Input: vs.VideoNode,
Preset: str = 'Slower',
TR0: Optional[int] = None,
TR1: Optional[int] = None,
TR2: Optional[int] = None,
Rep0: Optional[int] = None,
Rep1: int = 0,
Rep2: Optional[int] = None,
EdiMode: Optional[str] = None,
RepChroma: bool = True,
NNSize: Optional[int] = None,
NNeurons: Optional[int] = None,
EdiQual: int = 1,
EdiMaxD: Optional[int] = None,
ChromaEdi: str = '',
EdiExt: Optional[vs.VideoNode] = None,
Sharpness: Optional[float] = None,
SMode: Optional[int] = None,
SLMode: Optional[int] = None,
SLRad: Optional[int] = None,
SOvs: int = 0,
SVThin: float = 0.0,
Sbb: Optional[int] = None,
SrchClipPP: Optional[int] = None,
SubPel: Optional[int] = None,
SubPelInterp: int = 2,
BlockSize: Optional[int] = None,
Overlap: Optional[int] = None,
Search: Optional[int] = None,
SearchParam: Optional[int] = None,
PelSearch: Optional[int] = None,
ChromaMotion: Optional[bool] = None,
TrueMotion: bool = False,
Lambda: Optional[int] = None,
LSAD: Optional[int] = None,
PNew: Optional[int] = None,
PLevel: Optional[int] = None,
GlobalMotion: bool = True,
DCT: int = 0,
ThSAD1: int = 640,
ThSAD2: int = 256,
ThSCD1: int = 180,
ThSCD2: int = 98,
SourceMatch: int = 0,
MatchPreset: Optional[str] = None,
MatchEdi: Optional[str] = None,
MatchPreset2: Optional[str] = None,
MatchEdi2: Optional[str] = None,
MatchTR2: int = 1,
MatchEnhance: float = 0.5,
Lossless: int = 0,
NoiseProcess: Optional[int] = None,
EZDenoise: Optional[float] = None,
EZKeepGrain: Optional[float] = None,
NoisePreset: str = 'Fast',
Denoiser: Optional[str] = None,
FftThreads: int = 1,
DenoiseMC: Optional[bool] = None,
NoiseTR: Optional[int] = None,
Sigma: Optional[float] = None,
ChromaNoise: bool = False,
ShowNoise: Union[bool, float] = 0.0,
GrainRestore: Optional[float] = None,
NoiseRestore: Optional[float] = None,
NoiseDeint: Optional[str] = None,
StabilizeNoise: Optional[bool] = None,
InputType: int = 0,
ProgSADMask: Optional[float] = None,
FPSDivisor: int = 1,
ShutterBlur: int = 0,
ShutterAngleSrc: float = 180.0,
ShutterAngleOut: float = 180.0,
SBlurLimit: int = 4,
Border: bool = False,
Precise: Optional[bool] = None,
Tuning: str = 'None',
ShowSettings: bool = False,
GlobalNames: str = 'QTGMC',
PrevGlobals: str = 'Replace',
ForceTR: int = 0,
Str: float = 2.0,
Amp: float = 0.0625,
FastMA: bool = False,
ESearchP: bool = False,
RefineMotion: bool = False,
TFF: Optional[bool] = None,
nnedi3_args: Mapping[str, Any] = {},
eedi3_args: Mapping[str, Any] = {},
opencl: bool = False,
device: Optional[int] = None,
) -> vs.VideoNode:
und welche direkt durch die Presets abgedeckt werden
# Very Very Super Ultra
# Preset groups: Placebo Slow Slower Slow Medium Fast Faster Fast Fast Fast Draft
TR0 = fallback(TR0, [ 2, 2, 2, 2, 2, 2, 1, 1, 1, 1, 0 ][pNum])
TR1 = fallback(TR1, [ 2, 2, 2, 1, 1, 1, 1, 1, 1, 1, 1 ][pNum])
TR2X = fallback(TR2, [ 3, 2, 1, 1, 1, 0, 0, 0, 0, 0, 0 ][pNum])
Rep0 = fallback(Rep0, [ 4, 4, 4, 4, 3, 3, 0, 0, 0, 0, 0 ][pNum])
Rep2 = fallback(Rep2, [ 4, 4, 4, 4, 4, 4, 4, 4, 3, 3, 0 ][pNum])
EdiMode = fallback(EdiMode, ['NNEDI3', 'NNEDI3', 'NNEDI3', 'NNEDI3', 'NNEDI3', 'NNEDI3', 'NNEDI3', 'NNEDI3', 'NNEDI3', 'Bwdif', 'Bob' ][pNum]).lower()
NNSize = fallback(NNSize, [ 1, 1, 1, 1, 5, 5, 4, 4, 4, 4, 4 ][pNum])
NNeurons = fallback(NNeurons, [ 2, 2, 1, 1, 1, 0, 0, 0, 0, 0, 0 ][pNum])
EdiMaxD = fallback(EdiMaxD, [ 12, 10, 8, 7, 7, 6, 6, 5, 4, 4, 4 ][pNum])
SMode = fallback(SMode, [ 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 0 ][pNum])
SLModeX = fallback(SLMode, [ 2, 2, 2, 2, 2, 2, 2, 2, 0, 0, 0 ][pNum])
SLRad = fallback(SLRad, [ 3, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1 ][pNum])
Sbb = fallback(Sbb, [ 3, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0 ][pNum])
SrchClipPP = fallback(SrchClipPP, [ 3, 3, 3, 3, 3, 2, 2, 2, 1, 1, 0 ][pNum])
SubPel = fallback(SubPel, [ 2, 2, 2, 2, 1, 1, 1, 1, 1, 1, 1 ][pNum])
BlockSize = fallback(BlockSize, [ bs, bs, bs, bs, bs, bs, bs2, bs2, bs2, bs2, bs2 ][pNum])
bs = BlockSize
Overlap = fallback(Overlap, [ bs // 2, bs // 2, bs // 2, bs // 2, bs // 2, bs // 2, bs // 2, bs // 4, bs // 4, bs // 4, bs // 4][pNum])
Search = fallback(Search, [ 5, 4, 4, 4, 4, 4, 4, 4, 0, 0, 0 ][pNum])
SearchParam = fallback(SearchParam, [ 2, 2, 2, 2, 2, 2, 2, 1, 1, 1, 1 ][pNum])
PelSearch = fallback(PelSearch, [ 2, 2, 2, 2, 1, 1, 1, 1, 1, 1, 1 ][pNum])
ChromaMotion = fallback(ChromaMotion, [ True, True, True, False, False, False, False, False, False, False, False ][pNum])
Precise = fallback(Precise, [ True, True, False, False, False, False, False, False, False, False, False ][pNum])
ProgSADMask = fallback(ProgSADMask, [ 10.0, 10.0, 10.0, 10.0, 10.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0 ][pNum])
QTGMC ist ja gerade ein Skript, was viele Parameter und Presets hat, damit auch ohne die Syntax voll zu verstehen brauchbar deinterlacen kann.
Zu BWDIF:
bwdif.Bwdif(vnode clip, int field[, vnode edeint=None, int opt=0])
Quote:edeint: Allows the specification of an external clip from which to take spatial predictions instead of having Bwdif use cubic interpolation. This clip must be the same width, height, and colorspace as the input clip. If using same rate output, this clip should have the same number of frames as the input. If using double rate output, this clip should have twice as many frames as the input.Was für Optionen sollen den zur Auswahl stehen und was für Code soll erstellt werden?
Bei YadifMode wird einfach:
edeint=core.znedi3.nnedi3(clip=clip,field=X)
edeint=core.eedi3.eedi3(clip=clip,field=X)
edeint=core.nnedi3cl.NNEDI3CL(clip=clip,field=X)
Was znedi3 kann, kannst Du bei https://github.com/sekrit-twc/znedi3 sehen.
Was NNEDI3CL kann, kannst Du bei https://github.com/HomeOfVapourSynthEvol...h-NNEDI3CL sehen.
Was EEDI3 bzw. EEDI3CL kann, kannst Du bei https://github.com/HomeOfVapourSynthEvol...ynth-EEDI3 sehen.
in durchaus bereit in BWDIF Elemente hinzufügen, um den edeint-Parameter zu nutzen, brauch aber mehr Details, da ich selber BWDIF nicht nutze.
Wenn Du mir (!genau!) sagen kannst, was für Parameter mit welchen Werten unterstützt werden sollen und was da für Code entstehen muss, kann ich da was für schreiben.
Cu Selur