PDA

View Full Version : Dark DV Footage, Any way to improve this script?


mikeytown2
11th July 2008, 08:20
This is an UGLY tape from my DV cam. It's filmed inside a cave and its dark and sometimes blurry (usually what happens when you let someone borrow your cheap cam). I don't care too much about the blurriness(can't do a whole lot), I am trying to get this lighter and denoised. Speed is a minor concern.

Clip Link 53MB
http://www.megaupload.com/?d=JLG0FGAE

Here is my current script

AssumeBFF()

s = last
#Try to Get more data from other color channels
ConvertToRGB32().ChannelMixer(-100,100,100,100,-100,100,100,100,-100).ConvertToYv12().Tweak(180,0.5).Overlay(s,opacity=0.5)

#White Balance
ConvertToRGB32().ChannelMixer(100,0,0,0,90,10,10,0,100).ConvertToYv12()

mvdegrain3i(4,0,1)

HDRAGC(max_gain=40, coef_gain=20, coef_sat=1, avg_lum=0, reducer=0)
Levels(85,1,255,0,255)
mvdegrain3i(4,0,2)



function MVDegrain3i(clip "source", int "overlap", int "dct", int "idx", int "thSAD")
{
overlap=default(overlap,0) # overlap value (0 to 4 for blksize=8)
dct=default(dct,0) # use dct=1 for clip with light flicker
idx=default(idx,1) # use various idx for different sources in same script
thSAD=default(thSAD,400) # Strength of filter

fields=source.SeparateFields() # separate by fields
backward_vec2 = fields.MVAnalyse(isb = true, delta = 2, pel = 2, overlap=overlap, idx = idx,dct=dct)
forward_vec2 = fields.MVAnalyse(isb = false, delta = 2, pel = 2, overlap=overlap, idx = idx,dct=dct)
backward_vec4 = fields.MVAnalyse(isb = true, delta = 4, pel = 2, overlap=overlap, idx = idx,dct=dct)
forward_vec4 = fields.MVAnalyse(isb = false, delta = 4, pel = 2, overlap=overlap, idx = idx,dct=dct)
backward_vec6 = fields.MVAnalyse(isb = true, delta = 6, pel = 2, overlap=overlap, idx = idx,dct=dct)
forward_vec6 = fields.MVAnalyse(isb = false, delta = 6, pel = 2, overlap=overlap, idx = idx,dct=dct)
fields.MVDegrain3(backward_vec2,forward_vec2,backward_vec4,forward_vec4,backward_vec6,forward_vec6,thSAD=thSAD,idx=idx)
Weave()
}

StackHorizontal(last,s)


Before and After on frame 290
http://img258.imageshack.us/img258/3718/frame290fi2.th.jpg (http://img258.imageshack.us/my.php?image=frame290fi2.jpg)

Function List:
ChannelMixer (http://www.videohelp.com/forum/archive/nice-results-with-avisynth-color-channel-mixer-t339327.html)
HDRAGC (http://strony.aster.pl/paviko/hdragc.htm)
mvdegrain3i (http://avisynth.org.ru/mvtools/mvtools.html)

yup
11th July 2008, 10:24
mikeytown2!
HDRAGC() need make on fields

SeparateFields()
HDRAGC()
Weave()
yup.

Gavino
11th July 2008, 15:58
#White Balance
ConvertToRGB32().ChannelMixer(100,0,0,0,90,10,10,0,100).ConvertToYv12()


Are you sure this is right? I would expect white balance (http://en.wikipedia.org/wiki/White_balance) to use a diagonal matrix, ie no cross-channel components.

mikeytown2
11th July 2008, 20:23
@Gavino, i miss labeled that, i need to remove green from the clip

Been tweaking this, here is my latest one

AssumeBFF()

s = last
#Try to Get more data from other color channels
ConvertToRGB32().ChannelMixer(-100,100,100,100,-100,100,100,100,-100).ConvertToYv12().Tweak(180,0.5).Overlay(s,opacity=0.5)


MVDegrain6i(4,0,1,3000)

SeparateFields()
HDRAGC(max_gain=40, coef_gain=19, coef_sat=0.5, avg_lum=0, reducer=0)
Weave()
Levels(85,1.0,255,0,255)
MVDegrain3i(4,0,2)

#Kill Green
ConvertToRGB32().ChannelMixer(104,0,0,0,96,0,0,0,105).ConvertToYv12()

#Brighten dark again
Overlay(Levels(5,1.2,128,0,255).Tweak(0,1.5),mask=Levels(0,1,128,0,255).Grayscale().Invert().Blur(1.5))
Levels(10,1.05,245,0,255)


SeparateFields()
LimitedSharpenFaster()
Weave()

StackHorizontal(last,s)

function MVDegrain3i(clip "source", int "overlap", int "dct", int "idx", int "thSAD")
{
overlap=default(overlap,0) # overlap value (0 to 4 for blksize=8)
dct=default(dct,0) # use dct=1 for clip with light flicker
idx=default(idx,1) # use various idx for different sources in same script
thSAD=default(thSAD,400) # Strength of filter

fields=source.SeparateFields() # separate by fields
backward_vec2 = fields.MVAnalyse(isb = true, delta = 2, pel = 2, overlap=overlap, idx = idx,dct=dct)
forward_vec2 = fields.MVAnalyse(isb = false, delta = 2, pel = 2, overlap=overlap, idx = idx,dct=dct)
backward_vec4 = fields.MVAnalyse(isb = true, delta = 4, pel = 2, overlap=overlap, idx = idx,dct=dct)
forward_vec4 = fields.MVAnalyse(isb = false, delta = 4, pel = 2, overlap=overlap, idx = idx,dct=dct)
backward_vec6 = fields.MVAnalyse(isb = true, delta = 6, pel = 2, overlap=overlap, idx = idx,dct=dct)
forward_vec6 = fields.MVAnalyse(isb = false, delta = 6, pel = 2, overlap=overlap, idx = idx,dct=dct)
fields.MVDegrain3(backward_vec2,forward_vec2,backward_vec4,forward_vec4,backward_vec6,forward_vec6,thSAD=thSAD,idx=idx)
Weave()
}



function MVDegrain6i(clip "source", int "overlap", int "dct", int "idx", int "thSAD")
{
overlap=default(overlap,0) # overlap value (0 to 4 for blksize=8)
dct=default(dct,0) # use dct=1 for clip with light flicker
idx=default(idx,1) # use various idx for different sources in same script
thSAD=default(thSAD,400) # Strength of filter

fields=source.SeparateFields() # separate by fields

bvec1 = fields.MVAnalyse(isb=true, delta=2, pel = 2, overlap=overlap, idx = idx,dct=dct)
bvec2 = fields.MVAnalyse(isb=true, delta=4, pel = 2, overlap=overlap, idx = idx,dct=dct)
bvec3 = fields.MVAnalyse(isb=true, delta=6, pel = 2, overlap=overlap, idx = idx,dct=dct)
bvec4 = fields.MVAnalyse(isb=true, delta=8, pel = 2, overlap=overlap, idx = idx,dct=dct)
bvec5 = fields.MVAnalyse(isb=true, delta=10, pel = 2, overlap=overlap, idx = idx,dct=dct)
bvec6 = fields.MVAnalyse(isb=true, delta=12, pel = 2, overlap=overlap, idx = idx,dct=dct)
fvec1 = fields.MVAnalyse(isb=false,delta=2, pel = 2, overlap=overlap, idx = idx,dct=dct)
fvec2 = fields.MVAnalyse(isb=false,delta=4, pel = 2, overlap=overlap, idx = idx,dct=dct)
fvec3 = fields.MVAnalyse(isb=false,delta=6, pel = 2, overlap=overlap, idx = idx,dct=dct)
fvec4 = fields.MVAnalyse(isb=false,delta=8, pel = 2, overlap=overlap, idx = idx,dct=dct)
fvec5 = fields.MVAnalyse(isb=false,delta=10, pel = 2, overlap=overlap, idx = idx,dct=dct)
fvec6 = fields.MVAnalyse(isb=false,delta=12, pel = 2, overlap=overlap, idx = idx,dct=dct)

mvdg123 = fields.MVDegrain3(bvec1,fvec1,bvec2,fvec2,bvec3,fvec3,thSAD=thSAD,idx=idx)
mvdg456 = fields.MVDegrain3(bvec4,fvec4,bvec5,fvec5,bvec6,fvec6,thSAD=thSAD,idx=idx)

mvdg123456 = Merge( mvdg123, mvdg456, 0.4615 ) # this gives MVDegrain6()
mvdg123456.Weave()
}


http://img381.imageshack.us/img381/1908/frame290aep6.th.jpg (http://img381.imageshack.us/my.php?image=frame290aep6.jpg)
Anyone have any idea why it looks like a weaved basket? Is it because my cam is a basket case in low light?:p My guess is cheap anti-aliasing built into the cam.

Used
MVDegrain6 (http://forum.doom9.org/showthread.php?p=1141506#post1141506)

Chainmax
13th July 2008, 18:16
You might want to try Autolevels (http://forum.doom9.org/showthread.php?t=128585) as an alternative to HDRAGC, its' pretty good.

mikeytown2
13th July 2008, 20:06
Good Find Chainmax, I used Autolevels elsewhere. I tried and HDRAGC is doing a good job. I couldn't directly replace it with Autolevels.


AssumeBFF()

s = last
#Try to Get more data from other color channels
ConvertToRGB32(interlaced=true).ChannelMixer(-100,100,100,100,-100,100,100,100,-100).ConvertToYv12(interlaced=true).Tweak(180,0.5).Overlay(s,opacity=0.5)


MergeChroma(MVDegrain3i(4,0,1), MVDegrain6i(4,0,3,5000))

SeparateFields()
HDRAGC(max_gain=40, coef_gain=19, coef_sat=0.5, avg_lum=0, reducer=0)
Weave()
Levels(85,1.0,255,0,255)



#Brighten dark again and denoise dark
hi = 128
Overlay(Levels(0,1,hi,0,hi).Autolevels().Tweak(0,2).MVDegrain3i(4,0,2),mask=Levels(0,1,hi,0,255).Grayscale().Invert().Blur(1.5))
#Levels(10,1.05,245,0,255)


SeparateFields()
LimitedSharpenFaster()
Weave()

StackHorizontal(last,s)

function MVDegrain3i(clip "source", int "overlap", int "dct", int "idx", int "thSAD")
{
overlap=default(overlap,0) # overlap value (0 to 4 for blksize=8)
dct=default(dct,0) # use dct=1 for clip with light flicker
idx=default(idx,1) # use various idx for different sources in same script
thSAD=default(thSAD,400) # Strength of filter

fields=source.SeparateFields() # separate by fields
backward_vec2 = fields.MVAnalyse(isb = true, delta = 2, pel = 2, overlap=overlap, idx = idx,dct=dct)
forward_vec2 = fields.MVAnalyse(isb = false, delta = 2, pel = 2, overlap=overlap, idx = idx,dct=dct)
backward_vec4 = fields.MVAnalyse(isb = true, delta = 4, pel = 2, overlap=overlap, idx = idx,dct=dct)
forward_vec4 = fields.MVAnalyse(isb = false, delta = 4, pel = 2, overlap=overlap, idx = idx,dct=dct)
backward_vec6 = fields.MVAnalyse(isb = true, delta = 6, pel = 2, overlap=overlap, idx = idx,dct=dct)
forward_vec6 = fields.MVAnalyse(isb = false, delta = 6, pel = 2, overlap=overlap, idx = idx,dct=dct)
fields.MVDegrain3(backward_vec2,forward_vec2,backward_vec4,forward_vec4,backward_vec6,forward_vec6,thSAD=thSAD,idx=idx)
Weave()
}



function MVDegrain6i(clip "source", int "overlap", int "dct", int "idx", int "thSAD")
{
overlap=default(overlap,0) # overlap value (0 to 4 for blksize=8)
dct=default(dct,0) # use dct=1 for clip with light flicker
idx=default(idx,1) # use various idx for different sources in same script
thSAD=default(thSAD,400) # Strength of filter

fields=source.SeparateFields() # separate by fields

bvec1 = fields.MVAnalyse(isb=true, delta=2, pel = 2, overlap=overlap, idx = idx,dct=dct)
bvec2 = fields.MVAnalyse(isb=true, delta=4, pel = 2, overlap=overlap, idx = idx,dct=dct)
bvec3 = fields.MVAnalyse(isb=true, delta=6, pel = 2, overlap=overlap, idx = idx,dct=dct)
bvec4 = fields.MVAnalyse(isb=true, delta=8, pel = 2, overlap=overlap, idx = idx,dct=dct)
bvec5 = fields.MVAnalyse(isb=true, delta=10, pel = 2, overlap=overlap, idx = idx,dct=dct)
bvec6 = fields.MVAnalyse(isb=true, delta=12, pel = 2, overlap=overlap, idx = idx,dct=dct)
fvec1 = fields.MVAnalyse(isb=false,delta=2, pel = 2, overlap=overlap, idx = idx,dct=dct)
fvec2 = fields.MVAnalyse(isb=false,delta=4, pel = 2, overlap=overlap, idx = idx,dct=dct)
fvec3 = fields.MVAnalyse(isb=false,delta=6, pel = 2, overlap=overlap, idx = idx,dct=dct)
fvec4 = fields.MVAnalyse(isb=false,delta=8, pel = 2, overlap=overlap, idx = idx,dct=dct)
fvec5 = fields.MVAnalyse(isb=false,delta=10, pel = 2, overlap=overlap, idx = idx,dct=dct)
fvec6 = fields.MVAnalyse(isb=false,delta=12, pel = 2, overlap=overlap, idx = idx,dct=dct)

mvdg123 = fields.MVDegrain3(bvec1,fvec1,bvec2,fvec2,bvec3,fvec3,thSAD=thSAD,idx=idx)
mvdg456 = fields.MVDegrain3(bvec4,fvec4,bvec5,fvec5,bvec6,fvec6,thSAD=thSAD,idx=idx)

mvdg123456 = Merge( mvdg123, mvdg456, 0.4615 ) # this gives MVDegrain6()
mvdg123456.Weave()
}


Before interlaced=true
http://img210.imageshack.us/img210/9577/frame290bjl2.th.jpg (http://img210.imageshack.us/my.php?image=frame290bjl2.jpg)

After interlaced=true
http://img388.imageshack.us/img388/6258/frame290bce2.th.jpg (http://img388.imageshack.us/my.php?image=frame290bce2.jpg)

LimitedSharpenFaster (http://avisynth.org/mediawiki/LimitedSharpen)

Edit:
Add in Overlay(last,s,opacity=___) to select the power of this function group.