AVIL
24th January 2024, 23:28
Hi all:
I work mainly with VHS footage.,frecuently very noisy (jitter, swimmering, rainbows). Ordinary strong cleaners do wonderful with noise but, alas, destroy also detail. I've combined two denoisers. The frist do a soft denoinsing, suited to clean less and destroy more detail. I've found that feed mvdegrain with vectors obtained with dct=1 leads to the type of denoise I need. After that, all the noise and detail stealed by the first denoiser is added to the original file, enhancing detail an worsing noise. Then the last step. A strong denoiser than clean well and respect detail. This is the script:
#********************************************************************************************
function VHSClean(clip x ,int "ths" , bool "blur_sharp"){
#********************************************************************************************
ths = default( ths , 100 ) #compromise between strong denoising and detail lost
blur_sharp = default( blur_sharp , true )
lambda = 40000
pel = 2
tm = false
srhp = 2
srch = 4
badsad = 2000
chroma = true
thsc = ths * 2
ths1= ths * 4
thsc1= ths1* 2
bs = 8
bblur = 0.6
csharp = 0.6
# Required planar video (tested on YV16)
# Rrequired masktools2, mvtools2. Modern versions
# Only tested on VHS footage
# Video must be progressive, preferiblely using a good bob deinterlacer
sx=x.mSuper(pel=pel, sharp=1)
#phase 1. Soft denoising
f1x=sx.MAnalyse(delta=1,isb=false,truemotion=tm,blksize=16,blksizev=8,overlap=8,overlapv=4,search=srch,searchparam=srhp,badsad=badsad,dct=1,chroma=chroma,lambda=lambda)
b1x=sx.MAnalyse(delta=1,isb= true,truemotion=tm,blksize=16,blksizev=8,overlap=8,overlapv=4,search=srch,searchparam=srhp,badsad=badsad,dct=1,chroma=chroma,lambda=lambda)
f2x=sx.MAnalyse(delta=2,isb=false,truemotion=tm,blksize=16,blksizev=8,overlap=8,overlapv=4,search=srch,searchparam=srhp,badsad=badsad,dct=1,chroma=chroma,lambda=lambda)
b2x=sx.MAnalyse(delta=2,isb= true,truemotion=tm,blksize=16,blksizev=8,overlap=8,overlapv=4,search=srch,searchparam=srhp,badsad=badsad,dct=1,chroma=chroma,lambda=lambda)
x2=x.MDeGrain2(sx, b1x,f1x,b2x,f2x,thSAD=ths,thSADC=thsc)
#phase 2. Reinject denoised over original (like a sharpening using blurred version)
x3=x.mt_lutxy(x2,expr="x 2 * y -",chroma="process")
#phase 3. Strong denoising. Same style as MCDegrainSharp (By Didée and Stainless)
x0 = (blur_sharp) ? x3.sharpen(csharp): x3
x1 = (blur_sharp) ? x3.blur(bblur) : x3
sx0 = x0.MSuper(pel=pel, sharp=1,levels=1) # Only 1 Level required for sharpened Super (not MAnalyse-ing)
sx1 = x1.MSuper(pel=pel, sharp=1)
f1x1=sx1.MAnalyse(delta=1,isb=false,truemotion=tm,blksize=64,blksizev=64,overlap=32,overlapv=32,search=srch,searchparam=srhp,badsad=badsad,dct=0,chroma=chroma,lambda=lambda)
b1x1=sx1.MAnalyse(delta=1,isb= true,truemotion=tm,blksize=64,blksizev=64,overlap=32,overlapv=32,search=srch,searchparam=srhp,badsad=badsad,dct=0,chroma=chroma,lambda=lambda)
f2x1=sx1.MAnalyse(delta=2,isb=false,truemotion=tm,blksize=64,blksizev=64,overlap=32,overlapv=32,search=srch,searchparam=srhp,badsad=badsad,dct=0,chroma=chroma,lambda=lambda)
b2x1=sx1.MAnalyse(delta=2,isb= true,truemotion=tm,blksize=64,blksizev=64,overlap=32,overlapv=32,search=srch,searchparam=srhp,badsad=badsad,dct=0,chroma=chroma,lambda=lambda)
f3x1=sx1.MAnalyse(delta=3,isb=false,truemotion=tm,blksize=64,blksizev=64,overlap=32,overlapv=32,search=srch,searchparam=srhp,badsad=badsad,dct=0,chroma=chroma,lambda=lambda)
b3x1=sx1.MAnalyse(delta=3,isb= true,truemotion=tm,blksize=64,blksizev=64,overlap=32,overlapv=32,search=srch,searchparam=srhp,badsad=badsad,dct=0,chroma=chroma,lambda=lambda)
f4x1=sx1.MAnalyse(delta=4,isb=false,truemotion=tm,blksize=64,blksizev=64,overlap=32,overlapv=32,search=srch,searchparam=srhp,badsad=badsad,dct=0,chroma=chroma,lambda=lambda)
b4x1=sx1.MAnalyse(delta=4,isb= true,truemotion=tm,blksize=64,blksizev=64,overlap=32,overlapv=32,search=srch,searchparam=srhp,badsad=badsad,dct=0,chroma=chroma,lambda=lambda)
f5x1=sx1.MAnalyse(delta=5,isb=false,truemotion=tm,blksize=64,blksizev=64,overlap=32,overlapv=32,search=srch,searchparam=srhp,badsad=badsad,dct=0,chroma=chroma,lambda=lambda)
b5x1=sx1.MAnalyse(delta=5,isb= true,truemotion=tm,blksize=64,blksizev=64,overlap=32,overlapv=32,search=srch,searchparam=srhp,badsad=badsad,dct=0,chroma=chroma,lambda=lambda)
f6x1=sx1.MAnalyse(delta=6,isb=false,truemotion=tm,blksize=64,blksizev=64,overlap=32,overlapv=32,search=srch,searchparam=srhp,badsad=badsad,dct=0,chroma=chroma,lambda=lambda)
b6x1=sx1.MAnalyse(delta=6,isb= true,truemotion=tm,blksize=64,blksizev=64,overlap=32,overlapv=32,search=srch,searchparam=srhp,badsad=badsad,dct=0,chroma=chroma,lambda=lambda)
x4 = x1.MDeGrain6(sx0, b1x1,f1x1,b2x1,f2x1,b3x1,f3x1,b4x1,f4x1,b5x1,f5x1,b6x1,f6x1,thSAD=ths1,thSADC=thsc1)
#phase 4. Recover quick flying objects and water drops
mx=x4.blur(1.5).mt_lutxy(x3.blur(1.5),expr="y x - abs 12 > 255 0 ?",chroma="process")
x4.mt_merge(x3,mx.blur(1.5),luma=true)
}
Very interested in your feedback and ideas to enhance
I work mainly with VHS footage.,frecuently very noisy (jitter, swimmering, rainbows). Ordinary strong cleaners do wonderful with noise but, alas, destroy also detail. I've combined two denoisers. The frist do a soft denoinsing, suited to clean less and destroy more detail. I've found that feed mvdegrain with vectors obtained with dct=1 leads to the type of denoise I need. After that, all the noise and detail stealed by the first denoiser is added to the original file, enhancing detail an worsing noise. Then the last step. A strong denoiser than clean well and respect detail. This is the script:
#********************************************************************************************
function VHSClean(clip x ,int "ths" , bool "blur_sharp"){
#********************************************************************************************
ths = default( ths , 100 ) #compromise between strong denoising and detail lost
blur_sharp = default( blur_sharp , true )
lambda = 40000
pel = 2
tm = false
srhp = 2
srch = 4
badsad = 2000
chroma = true
thsc = ths * 2
ths1= ths * 4
thsc1= ths1* 2
bs = 8
bblur = 0.6
csharp = 0.6
# Required planar video (tested on YV16)
# Rrequired masktools2, mvtools2. Modern versions
# Only tested on VHS footage
# Video must be progressive, preferiblely using a good bob deinterlacer
sx=x.mSuper(pel=pel, sharp=1)
#phase 1. Soft denoising
f1x=sx.MAnalyse(delta=1,isb=false,truemotion=tm,blksize=16,blksizev=8,overlap=8,overlapv=4,search=srch,searchparam=srhp,badsad=badsad,dct=1,chroma=chroma,lambda=lambda)
b1x=sx.MAnalyse(delta=1,isb= true,truemotion=tm,blksize=16,blksizev=8,overlap=8,overlapv=4,search=srch,searchparam=srhp,badsad=badsad,dct=1,chroma=chroma,lambda=lambda)
f2x=sx.MAnalyse(delta=2,isb=false,truemotion=tm,blksize=16,blksizev=8,overlap=8,overlapv=4,search=srch,searchparam=srhp,badsad=badsad,dct=1,chroma=chroma,lambda=lambda)
b2x=sx.MAnalyse(delta=2,isb= true,truemotion=tm,blksize=16,blksizev=8,overlap=8,overlapv=4,search=srch,searchparam=srhp,badsad=badsad,dct=1,chroma=chroma,lambda=lambda)
x2=x.MDeGrain2(sx, b1x,f1x,b2x,f2x,thSAD=ths,thSADC=thsc)
#phase 2. Reinject denoised over original (like a sharpening using blurred version)
x3=x.mt_lutxy(x2,expr="x 2 * y -",chroma="process")
#phase 3. Strong denoising. Same style as MCDegrainSharp (By Didée and Stainless)
x0 = (blur_sharp) ? x3.sharpen(csharp): x3
x1 = (blur_sharp) ? x3.blur(bblur) : x3
sx0 = x0.MSuper(pel=pel, sharp=1,levels=1) # Only 1 Level required for sharpened Super (not MAnalyse-ing)
sx1 = x1.MSuper(pel=pel, sharp=1)
f1x1=sx1.MAnalyse(delta=1,isb=false,truemotion=tm,blksize=64,blksizev=64,overlap=32,overlapv=32,search=srch,searchparam=srhp,badsad=badsad,dct=0,chroma=chroma,lambda=lambda)
b1x1=sx1.MAnalyse(delta=1,isb= true,truemotion=tm,blksize=64,blksizev=64,overlap=32,overlapv=32,search=srch,searchparam=srhp,badsad=badsad,dct=0,chroma=chroma,lambda=lambda)
f2x1=sx1.MAnalyse(delta=2,isb=false,truemotion=tm,blksize=64,blksizev=64,overlap=32,overlapv=32,search=srch,searchparam=srhp,badsad=badsad,dct=0,chroma=chroma,lambda=lambda)
b2x1=sx1.MAnalyse(delta=2,isb= true,truemotion=tm,blksize=64,blksizev=64,overlap=32,overlapv=32,search=srch,searchparam=srhp,badsad=badsad,dct=0,chroma=chroma,lambda=lambda)
f3x1=sx1.MAnalyse(delta=3,isb=false,truemotion=tm,blksize=64,blksizev=64,overlap=32,overlapv=32,search=srch,searchparam=srhp,badsad=badsad,dct=0,chroma=chroma,lambda=lambda)
b3x1=sx1.MAnalyse(delta=3,isb= true,truemotion=tm,blksize=64,blksizev=64,overlap=32,overlapv=32,search=srch,searchparam=srhp,badsad=badsad,dct=0,chroma=chroma,lambda=lambda)
f4x1=sx1.MAnalyse(delta=4,isb=false,truemotion=tm,blksize=64,blksizev=64,overlap=32,overlapv=32,search=srch,searchparam=srhp,badsad=badsad,dct=0,chroma=chroma,lambda=lambda)
b4x1=sx1.MAnalyse(delta=4,isb= true,truemotion=tm,blksize=64,blksizev=64,overlap=32,overlapv=32,search=srch,searchparam=srhp,badsad=badsad,dct=0,chroma=chroma,lambda=lambda)
f5x1=sx1.MAnalyse(delta=5,isb=false,truemotion=tm,blksize=64,blksizev=64,overlap=32,overlapv=32,search=srch,searchparam=srhp,badsad=badsad,dct=0,chroma=chroma,lambda=lambda)
b5x1=sx1.MAnalyse(delta=5,isb= true,truemotion=tm,blksize=64,blksizev=64,overlap=32,overlapv=32,search=srch,searchparam=srhp,badsad=badsad,dct=0,chroma=chroma,lambda=lambda)
f6x1=sx1.MAnalyse(delta=6,isb=false,truemotion=tm,blksize=64,blksizev=64,overlap=32,overlapv=32,search=srch,searchparam=srhp,badsad=badsad,dct=0,chroma=chroma,lambda=lambda)
b6x1=sx1.MAnalyse(delta=6,isb= true,truemotion=tm,blksize=64,blksizev=64,overlap=32,overlapv=32,search=srch,searchparam=srhp,badsad=badsad,dct=0,chroma=chroma,lambda=lambda)
x4 = x1.MDeGrain6(sx0, b1x1,f1x1,b2x1,f2x1,b3x1,f3x1,b4x1,f4x1,b5x1,f5x1,b6x1,f6x1,thSAD=ths1,thSADC=thsc1)
#phase 4. Recover quick flying objects and water drops
mx=x4.blur(1.5).mt_lutxy(x3.blur(1.5),expr="y x - abs 12 > 255 0 ?",chroma="process")
x4.mt_merge(x3,mx.blur(1.5),luma=true)
}
Very interested in your feedback and ideas to enhance