SMDegrainChromaFix

Bei „SMDegrainChromaFix“ handelt es sich um eine Funktion, welche das Fixen beim Chroma einfacher macht. Außerdem ist es Default gut für Anime ausgelegt. Daneben hat es noch Unterteilungen bei einigen Parametern auf Luma/Chroma, die Default nicht dabei waren. Das normale SMDegrain wird vorausgesetzt.

Welches fixen beim Chroma ist gemeint?

Beim Chroma kann mit dem normalen SMDegrain eine Art „schmieren“ entstehen. So ist es auch in der Doku geschrieben. Weiter unten sind auch Vergleiche dazu.

Wie genau wird es denn gefixt?

Die Lösung ist recht simpel. Man muss jeweils das Chroma aufs Luma kopieren bzw. überschreiben und SMDegrain einzeln aufrufen (mit plane=0; Nur auf Luma anwenden). Später beim Resize verwirft man das Chroma einfach (Schnelligkeitsgründe) und fügt die 3x Luma wieder zu Luma (Y)-Chroma (Cr,U)-Chroma (Cb;V) zusammen. Dazu muss es nicht mal Hi444PP sein. Es macht auch bei normalem 720p durchaus Sinn.

Gibt es bei der Funktion etwas zu beachten?

Ja, diese muss auf die 1080p Source angewendet werden.
Nicht auf die nach dem Resize (z.B. 720p)!
(mir selber nicht ganz klar wieso, aber es ist so schneller)

Beispiele zu dem Problem:

Diese Diashow benötigt JavaScript.

Diese Diashow benötigt JavaScript.

Wie sieht denn das Skript aus?

Avisynth 2.6.0 or newer:

#Author: eXmendiC, Saeval
#Version: 1.6
function SMDegrainChromaFix(clip clp, int "tr", int "trc", int "blksize", int "blksizec", int "thSAD", int "thSADC", int "pel", int "pelc", int "subpixel", int "subpixelc", int "prefilter", int "prefilterc", bool "refinemotion", bool "refinemotionc", bool "contrasharp", bool "contrasharpc", bool "interlaced", bool "lsb_in", bool "lsb", bool "lsb_out", bool "show"){
 tr = default(tr, 2)
 trc = default(trc, tr)
 blksize =default(blksize, 16)
 blksizec =default(blksizec, blksize)
 thSAD = default(thSAD, 75)
 thSADC = default(thSADC, 50)
 pel = default(pel, 1)
 pelc = default(pelc, pel)
 subpixel = default(subpixel, 3)
 subpixelc = default(subpixelc, 0)
 prefilter = default(prefilter, 3)
 prefilterc = default(prefilterc, 2)
 refinemotion = default(refinemotion, true)
 refinemotionc = default(refinemotionc, false)
 contrasharp = default(contrasharp, false)
 contrasharpc = default(contrasharpc, false)
 interlaced = default(interlaced, false)
 lsb_in = default(lsb_in, true)
 lsb = default(lsb, true)
 lsb_out = default(lsb_out, true)
 show = default(show, false)

 U = clp.UToY().SMDegrain(tr=trc, blksize=blksizec, thSAD=thSADC, thSADC=0, refinemotion=refinemotionc, contrasharp=contrasharpc, interlaced=interlaced, plane=0, pel=pelc, subpixel=subpixelc, prefilter=prefilterc, chroma=false, lsb=lsb, lsb_in=lsb_in, lsb_out=lsb_out, Show=show)
 V = clp.VToY().SMDegrain(tr=trc, blksize=blksizec, thSAD=thSADC, thSADC=0, refinemotion=refinemotionc, contrasharp=contrasharpc, interlaced=interlaced, plane=0, pel=pelc, subpixel=subpixelc, prefilter=prefilterc, chroma=false, lsb=lsb, lsb_in=lsb_in, lsb_out=lsb_out, Show=show)
 Y = clp.SMDegrain(tr=tr, blksize=blksize, thSAD=thSAD, thSADC=0, refinemotion=refinemotion, contrasharp=contrasharp, interlaced=interlaced, plane=0, pel=pel, subpixel=subpixel, prefilter=prefilter, chroma=false, lsb=lsb, lsb_in=lsb_in, lsb_out=lsb_out, Show=show)

 return YToUV(U, V, Y)
}

 

Avisynth+ r2420 or newer:

#Author: eXmendiC, Saeval
#Version: 1.0 (AvS+)
function SMDegrainChromaFix(clip clp, int "tr", int "trc", int "blksize", int "blksizec", int "thSAD", int "thSADC", int "pel", int "pelc", int "subpixel", int "subpixelc", int "prefilter", int "prefilterc", bool "refinemotion", bool "refinemotionc", bool "contrasharp", bool "contrasharpc", bool "interlaced", bool "lsb_in", bool "lsb", bool "lsb_out", bool "show"){
 tr = default(tr, 2)
 trc = default(trc, tr)
 blksize =default(blksize, 16)
 blksizec =default(blksizec, blksize)
 thSAD = default(thSAD, 75)
 thSADC = default(thSADC, 50)
 pel = default(pel, 1)
 pelc = default(pelc, pel)
 subpixel = default(subpixel, 3)
 subpixelc = default(subpixelc, 0)
 prefilter = default(prefilter, 3)
 prefilterc = default(prefilterc, 2)
 refinemotion = default(refinemotion, true)
 refinemotionc = default(refinemotionc, false)
 contrasharp = default(contrasharp, false)
 contrasharpc = default(contrasharpc, false)
 interlaced = default(interlaced, false)
 lsb_in = default(lsb_in, true)
 lsb = default(lsb, true)
 lsb_out = default(lsb_out, true)
 show = default(show, false)

 U = clp.ExtractU().SMDegrain(tr=trc, blksize=blksizec, thSAD=thSADC, thSADC=0, refinemotion=refinemotionc, contrasharp=contrasharpc, interlaced=interlaced, plane=0, pel=pelc, subpixel=subpixelc, prefilter=prefilterc, chroma=false, lsb=lsb, lsb_in=lsb_in, lsb_out=lsb_out, Show=show)
 V = clp.ExtractV().SMDegrain(tr=trc, blksize=blksizec, thSAD=thSADC, thSADC=0, refinemotion=refinemotionc, contrasharp=contrasharpc, interlaced=interlaced, plane=0, pel=pelc, subpixel=subpixelc, prefilter=prefilterc, chroma=false, lsb=lsb, lsb_in=lsb_in, lsb_out=lsb_out, Show=show)
 Y = clp.SMDegrain(tr=tr, blksize=blksize, thSAD=thSAD, thSADC=0, refinemotion=refinemotion, contrasharp=contrasharp, interlaced=interlaced, plane=0, pel=pel, subpixel=subpixel, prefilter=prefilter, chroma=false, lsb=lsb, lsb_in=lsb_in, lsb_out=lsb_out, Show=show)

 return YToUV(U, V, Y)
}
Advertisements