R3Z
11th April 2007, 11:40
Hi Guys,
This here is a real shocker, someone has taken a rare concert footage VHS and sharpened the hell out of it resulting in massive noise and grain artifacts.
Normally i would cut my losses and move on, but because its a nirvana video and the masters are being hoarded due to geffen being aholes - i have to work with what i got.
Heres a sample (38mb);
http://users.on.net/inet_s51/x264/nirvana_chunk_1.mpg
I have tried Didee's magical script from this thread;(http://forum.doom9.org/showthread.php?t=122069)
Heres my results with my modifications (not sure if they are stupid or not) ;
Original
http://www.users.on.net/~inet_s51/x264/orig1_progressive.jpg
Processed
http://www.users.on.net/~inet_s51/x264/pro1_progressive.jpg
My script is as follows;
DGDecode_mpeg2source("F:\nirvana 92 brazil\nirvana_chunk_1.d2v",info=3)
ColorMatrix(hints=true,interlaced=true)
Bob(0,0.5)
bobbed = last
base = last.minblur(2).fft3dfilter(sigma=0.5,bt=4,plane=0,degrid=1.0,sigma2=0.6,sigma3=0.7,sigma4=0.8)
bw4_vec = base.MVAnalyse(isb=true, truemotion=false,delta=4,lambda=512,pel=2,sharp=2,blksize=16,overlap=16/2,pnew=32,idx=1)
bw3_vec = base.MVAnalyse(isb=true, truemotion=false,delta=3,lambda=512,pel=2,sharp=2,blksize=16,overlap=16/2,pnew=32,idx=1)
bw2_vec = base.MVAnalyse(isb=true, truemotion=false,delta=2,lambda=512,pel=2,sharp=2,blksize=16,overlap=16/2,pnew=32,idx=1)
bw1_vec = base.MVAnalyse(isb=true, truemotion=false,delta=1,lambda=512,pel=2,sharp=2,blksize=16,overlap=16/2,pnew=32,idx=1)
fw1_vec = base.MVAnalyse(isb=false, truemotion=false,delta=1,lambda=512,pel=2,sharp=2,blksize=16,overlap=16/2,pnew=32,idx=1)
fw2_vec = base.MVAnalyse(isb=false, truemotion=false,delta=2,lambda=512,pel=2,sharp=2,blksize=16,overlap=16/2,pnew=32,idx=1)
fw3_vec = base.MVAnalyse(isb=false, truemotion=false,delta=3,lambda=512,pel=2,sharp=2,blksize=16,overlap=16/2,pnew=32,idx=1)
fw4_vec = base.MVAnalyse(isb=false, truemotion=false,delta=4,lambda=512,pel=2,sharp=2,blksize=16,overlap=16/2,pnew=32,idx=1)
bw4_comp = bobbed.MVCompensate(bw4_vec,idx=2)
bw3_comp = bobbed.MVCompensate(bw3_vec,idx=2)
bw2_comp = bobbed.MVCompensate(bw2_vec,idx=2)
bw1_comp = bobbed.MVCompensate(bw1_vec,idx=2)
fw1_comp = bobbed.MVCompensate(fw1_vec,idx=2)
fw2_comp = bobbed.MVCompensate(fw2_vec,idx=2)
fw3_comp = bobbed.MVCompensate(fw3_vec,idx=2)
fw4_comp = bobbed.MVCompensate(fw4_vec,idx=2)
Interleave(bw4_comp,bw3_comp,bw2_comp,bw1_comp,bobbed,fw1_comp,fw2_comp,fw3_comp,fw4_comp)
MedianBlurT(0,0,0,4)
SelectEvery(9,4)
base2 = last
bobbed2 = last
bw4_vec2 = base2.MVAnalyse(isb=true, truemotion=false,delta=4,lambda=256,pel=2,sharp=2,blksize=8,overlap=8/2,pnew=32,idx=3)
bw3_vec2 = base2.MVAnalyse(isb=true, truemotion=false,delta=3,lambda=256,pel=2,sharp=2,blksize=8,overlap=8/2,pnew=32,idx=3)
bw2_vec2 = base2.MVAnalyse(isb=true, truemotion=false,delta=2,lambda=256,pel=2,sharp=2,blksize=8,overlap=8/2,pnew=32,idx=3)
bw1_vec2 = base2.MVAnalyse(isb=true, truemotion=false,delta=1,lambda=256,pel=2,sharp=2,blksize=8,overlap=8/2,pnew=32,idx=3)
fw1_vec2 = base2.MVAnalyse(isb=false, truemotion=false,delta=1,lambda=256,pel=2,sharp=2,blksize=8,overlap=8/2,pnew=32,idx=3)
fw2_vec2 = base2.MVAnalyse(isb=false, truemotion=false,delta=2,lambda=256,pel=2,sharp=2,blksize=8,overlap=8/2,pnew=32,idx=3)
fw3_vec2 = base2.MVAnalyse(isb=false, truemotion=false,delta=3,lambda=256,pel=2,sharp=2,blksize=8,overlap=8/2,pnew=32,idx=3)
fw4_vec2 = base2.MVAnalyse(isb=false, truemotion=false,delta=4,lambda=256,pel=2,sharp=2,blksize=8,overlap=8/2,pnew=32,idx=3)
bw4_comp2 = bobbed2.MVCompensate(bw4_vec2,idx=3)
bw3_comp2 = bobbed2.MVCompensate(bw3_vec2,idx=3)
bw2_comp2 = bobbed2.MVCompensate(bw2_vec2,idx=3)
bw1_comp2 = bobbed2.MVCompensate(bw1_vec2,idx=3)
fw1_comp2 = bobbed2.MVCompensate(fw1_vec2,idx=3)
fw2_comp2 = bobbed2.MVCompensate(fw2_vec2,idx=3)
fw3_comp2 = bobbed2.MVCompensate(fw3_vec2,idx=3)
fw4_comp2 = bobbed2.MVCompensate(fw4_vec2,idx=3)
Interleave(bw4_comp2,bw3_comp2,bw2_comp2,bw1_comp2,bobbed2,fw1_comp2,fw2_comp2,fw3_comp2,fw4_comp2)
fft3dfilter(sigma=0.5,bt=4,plane=0,degrid=1.0,sigma2=0.6,sigma3=0.7,sigma4=0.8)
SelectEvery(9,4)
maxx = bobbed.mt_logic(bw1_comp,"max")
\ .mt_logic(fw1_comp,"max")
minn = bobbed.mt_logic(bw1_comp,"min")
\ .mt_logic(fw1_comp,"min")
#.mt_logic(bw2_comp,"max").mt_logic(bw3_comp,"max")
#.mt_logic(fw2_comp,"max").mt_logic(fw3_comp,"max")
#.mt_logic(bw2_comp,"min").mt_logic(bw3_comp,"min")
#.mt_logic(fw2_comp,"min").mt_logic(fw3_comp,"min")
ssharp = mt_lutxy(last,last.RemoveGrain(11), \
"x x y - abs 12 / 1 4 / ^ 12 * x y - 2 ^ x y - 2 ^ 2.3 + / * x y - x y - abs 0.0001 + / * 1 x y - abs 16 / 1 4 / ^ + / +",U=2,V=2)
ssharp.mt_Clamp(maxx,minn,0,0,U=2,V=2)
interleave( selectevery(5,0).FluxSmoothT(7),selectevery(5,1).FluxSmoothT(7),
\ selectevery(5,2).FluxSmoothT(7),selectevery(5,3).FluxSmoothT(7),
\ selectevery(5,4).FluxSmoothT(7) )
#SeparateFields().SelectEvery(4,0,3).Weave() # re-interlace stage
SelectEven().trim(23470,23670)
return(last)
#=================================
# Nifty Gauss/Median combination
function MinBlur(clip clp, int r, int "uv")
{
uv = default(uv,3)
uv2 = (uv==2) ? 1 : uv
rg4 = (uv==3) ? 4 : -1
rg11 = (uv==3) ? 11 : -1
rg20 = (uv==3) ? 20 : -1
medf = (uv==3) ? 1 : -200
RG11D = (r==1) ? mt_MakeDiff(clp,clp.RemoveGrain(11,rg11),U=uv2,V=uv2)
\ : (r==2) ? mt_MakeDiff(clp,clp.RemoveGrain(11,rg11).RemoveGrain(11,rg11),U=uv2,V=uv2)
\ : mt_MakeDiff(clp,clp.RemoveGrain(11,rg11).RemoveGrain(20,rg20).RemoveGrain(20,rg20),U=uv2,V=uv2)
RG4D = (r==1) ? mt_MakeDiff(clp,clp.RemoveGrain(4,rg4),U=uv2,V=uv2)
\ : (r==2) ? mt_MakeDiff(clp,clp.medianblur(2,2*medf,2*medf),U=uv2,V=uv2)
\ : mt_MakeDiff(clp,clp.medianblur(3,3*medf,3*medf),U=uv2,V=uv2)
DD = mt_lutxy(RG11D,RG4D,"x 128 - y 128 - * 0 < 128 x 128 - abs y 128 - abs < x y ? ?",U=uv2,V=uv2)
(r==0) ? clp : clp.mt_MakeDiff(DD,U=uv,V=uv)
return(last)
}
#end
I basically tried to decrease the strength of the denoising and cut out as much bluring or smoothing as possible. I did notice that without minblur, the scenes would rapidly change from clean to noisy back and forth.
I would really love to know how this script works and maybe how to incorporate mvdegrain2 as the denoiser.
I have also seen the results from this post (http://forum.doom9.org/showthread.php?p=885124#post885124) which appear to have the exact same type of noise my video does.
Didée - It would be great to get that script :) :script:
Can i maybe get some suggestions on how to do things better ? Seriously - any time you spend looking at this is highly appreciated. This video means alot to me and so does other peoples help :)
This here is a real shocker, someone has taken a rare concert footage VHS and sharpened the hell out of it resulting in massive noise and grain artifacts.
Normally i would cut my losses and move on, but because its a nirvana video and the masters are being hoarded due to geffen being aholes - i have to work with what i got.
Heres a sample (38mb);
http://users.on.net/inet_s51/x264/nirvana_chunk_1.mpg
I have tried Didee's magical script from this thread;(http://forum.doom9.org/showthread.php?t=122069)
Heres my results with my modifications (not sure if they are stupid or not) ;
Original
http://www.users.on.net/~inet_s51/x264/orig1_progressive.jpg
Processed
http://www.users.on.net/~inet_s51/x264/pro1_progressive.jpg
My script is as follows;
DGDecode_mpeg2source("F:\nirvana 92 brazil\nirvana_chunk_1.d2v",info=3)
ColorMatrix(hints=true,interlaced=true)
Bob(0,0.5)
bobbed = last
base = last.minblur(2).fft3dfilter(sigma=0.5,bt=4,plane=0,degrid=1.0,sigma2=0.6,sigma3=0.7,sigma4=0.8)
bw4_vec = base.MVAnalyse(isb=true, truemotion=false,delta=4,lambda=512,pel=2,sharp=2,blksize=16,overlap=16/2,pnew=32,idx=1)
bw3_vec = base.MVAnalyse(isb=true, truemotion=false,delta=3,lambda=512,pel=2,sharp=2,blksize=16,overlap=16/2,pnew=32,idx=1)
bw2_vec = base.MVAnalyse(isb=true, truemotion=false,delta=2,lambda=512,pel=2,sharp=2,blksize=16,overlap=16/2,pnew=32,idx=1)
bw1_vec = base.MVAnalyse(isb=true, truemotion=false,delta=1,lambda=512,pel=2,sharp=2,blksize=16,overlap=16/2,pnew=32,idx=1)
fw1_vec = base.MVAnalyse(isb=false, truemotion=false,delta=1,lambda=512,pel=2,sharp=2,blksize=16,overlap=16/2,pnew=32,idx=1)
fw2_vec = base.MVAnalyse(isb=false, truemotion=false,delta=2,lambda=512,pel=2,sharp=2,blksize=16,overlap=16/2,pnew=32,idx=1)
fw3_vec = base.MVAnalyse(isb=false, truemotion=false,delta=3,lambda=512,pel=2,sharp=2,blksize=16,overlap=16/2,pnew=32,idx=1)
fw4_vec = base.MVAnalyse(isb=false, truemotion=false,delta=4,lambda=512,pel=2,sharp=2,blksize=16,overlap=16/2,pnew=32,idx=1)
bw4_comp = bobbed.MVCompensate(bw4_vec,idx=2)
bw3_comp = bobbed.MVCompensate(bw3_vec,idx=2)
bw2_comp = bobbed.MVCompensate(bw2_vec,idx=2)
bw1_comp = bobbed.MVCompensate(bw1_vec,idx=2)
fw1_comp = bobbed.MVCompensate(fw1_vec,idx=2)
fw2_comp = bobbed.MVCompensate(fw2_vec,idx=2)
fw3_comp = bobbed.MVCompensate(fw3_vec,idx=2)
fw4_comp = bobbed.MVCompensate(fw4_vec,idx=2)
Interleave(bw4_comp,bw3_comp,bw2_comp,bw1_comp,bobbed,fw1_comp,fw2_comp,fw3_comp,fw4_comp)
MedianBlurT(0,0,0,4)
SelectEvery(9,4)
base2 = last
bobbed2 = last
bw4_vec2 = base2.MVAnalyse(isb=true, truemotion=false,delta=4,lambda=256,pel=2,sharp=2,blksize=8,overlap=8/2,pnew=32,idx=3)
bw3_vec2 = base2.MVAnalyse(isb=true, truemotion=false,delta=3,lambda=256,pel=2,sharp=2,blksize=8,overlap=8/2,pnew=32,idx=3)
bw2_vec2 = base2.MVAnalyse(isb=true, truemotion=false,delta=2,lambda=256,pel=2,sharp=2,blksize=8,overlap=8/2,pnew=32,idx=3)
bw1_vec2 = base2.MVAnalyse(isb=true, truemotion=false,delta=1,lambda=256,pel=2,sharp=2,blksize=8,overlap=8/2,pnew=32,idx=3)
fw1_vec2 = base2.MVAnalyse(isb=false, truemotion=false,delta=1,lambda=256,pel=2,sharp=2,blksize=8,overlap=8/2,pnew=32,idx=3)
fw2_vec2 = base2.MVAnalyse(isb=false, truemotion=false,delta=2,lambda=256,pel=2,sharp=2,blksize=8,overlap=8/2,pnew=32,idx=3)
fw3_vec2 = base2.MVAnalyse(isb=false, truemotion=false,delta=3,lambda=256,pel=2,sharp=2,blksize=8,overlap=8/2,pnew=32,idx=3)
fw4_vec2 = base2.MVAnalyse(isb=false, truemotion=false,delta=4,lambda=256,pel=2,sharp=2,blksize=8,overlap=8/2,pnew=32,idx=3)
bw4_comp2 = bobbed2.MVCompensate(bw4_vec2,idx=3)
bw3_comp2 = bobbed2.MVCompensate(bw3_vec2,idx=3)
bw2_comp2 = bobbed2.MVCompensate(bw2_vec2,idx=3)
bw1_comp2 = bobbed2.MVCompensate(bw1_vec2,idx=3)
fw1_comp2 = bobbed2.MVCompensate(fw1_vec2,idx=3)
fw2_comp2 = bobbed2.MVCompensate(fw2_vec2,idx=3)
fw3_comp2 = bobbed2.MVCompensate(fw3_vec2,idx=3)
fw4_comp2 = bobbed2.MVCompensate(fw4_vec2,idx=3)
Interleave(bw4_comp2,bw3_comp2,bw2_comp2,bw1_comp2,bobbed2,fw1_comp2,fw2_comp2,fw3_comp2,fw4_comp2)
fft3dfilter(sigma=0.5,bt=4,plane=0,degrid=1.0,sigma2=0.6,sigma3=0.7,sigma4=0.8)
SelectEvery(9,4)
maxx = bobbed.mt_logic(bw1_comp,"max")
\ .mt_logic(fw1_comp,"max")
minn = bobbed.mt_logic(bw1_comp,"min")
\ .mt_logic(fw1_comp,"min")
#.mt_logic(bw2_comp,"max").mt_logic(bw3_comp,"max")
#.mt_logic(fw2_comp,"max").mt_logic(fw3_comp,"max")
#.mt_logic(bw2_comp,"min").mt_logic(bw3_comp,"min")
#.mt_logic(fw2_comp,"min").mt_logic(fw3_comp,"min")
ssharp = mt_lutxy(last,last.RemoveGrain(11), \
"x x y - abs 12 / 1 4 / ^ 12 * x y - 2 ^ x y - 2 ^ 2.3 + / * x y - x y - abs 0.0001 + / * 1 x y - abs 16 / 1 4 / ^ + / +",U=2,V=2)
ssharp.mt_Clamp(maxx,minn,0,0,U=2,V=2)
interleave( selectevery(5,0).FluxSmoothT(7),selectevery(5,1).FluxSmoothT(7),
\ selectevery(5,2).FluxSmoothT(7),selectevery(5,3).FluxSmoothT(7),
\ selectevery(5,4).FluxSmoothT(7) )
#SeparateFields().SelectEvery(4,0,3).Weave() # re-interlace stage
SelectEven().trim(23470,23670)
return(last)
#=================================
# Nifty Gauss/Median combination
function MinBlur(clip clp, int r, int "uv")
{
uv = default(uv,3)
uv2 = (uv==2) ? 1 : uv
rg4 = (uv==3) ? 4 : -1
rg11 = (uv==3) ? 11 : -1
rg20 = (uv==3) ? 20 : -1
medf = (uv==3) ? 1 : -200
RG11D = (r==1) ? mt_MakeDiff(clp,clp.RemoveGrain(11,rg11),U=uv2,V=uv2)
\ : (r==2) ? mt_MakeDiff(clp,clp.RemoveGrain(11,rg11).RemoveGrain(11,rg11),U=uv2,V=uv2)
\ : mt_MakeDiff(clp,clp.RemoveGrain(11,rg11).RemoveGrain(20,rg20).RemoveGrain(20,rg20),U=uv2,V=uv2)
RG4D = (r==1) ? mt_MakeDiff(clp,clp.RemoveGrain(4,rg4),U=uv2,V=uv2)
\ : (r==2) ? mt_MakeDiff(clp,clp.medianblur(2,2*medf,2*medf),U=uv2,V=uv2)
\ : mt_MakeDiff(clp,clp.medianblur(3,3*medf,3*medf),U=uv2,V=uv2)
DD = mt_lutxy(RG11D,RG4D,"x 128 - y 128 - * 0 < 128 x 128 - abs y 128 - abs < x y ? ?",U=uv2,V=uv2)
(r==0) ? clp : clp.mt_MakeDiff(DD,U=uv,V=uv)
return(last)
}
#end
I basically tried to decrease the strength of the denoising and cut out as much bluring or smoothing as possible. I did notice that without minblur, the scenes would rapidly change from clean to noisy back and forth.
I would really love to know how this script works and maybe how to incorporate mvdegrain2 as the denoiser.
I have also seen the results from this post (http://forum.doom9.org/showthread.php?p=885124#post885124) which appear to have the exact same type of noise my video does.
Didée - It would be great to get that script :) :script:
Can i maybe get some suggestions on how to do things better ? Seriously - any time you spend looking at this is highly appreciated. This video means alot to me and so does other peoples help :)