View Full Version : Banding in VHS capture?
kiwiusa
27th February 2008, 14:22
I have captured on old commercial VHS documentary and notice a lot of horizontal blue/green banding.
It seems to be constant throughtout the capture but is most apparent on blueish backgrounds (ice, sky).
I also tried two different VHS players, but the results were the same, so I'm guessing it's on the tape???
LimitedSharpenFaster seems to do a great job on improving the overall look of the video, but unfortunately also highlights this banding more.
Is there anything that can be done to minimise or correct this before I sharpen??
I've attached three images (Raw, After IVTC and after LSF)
Thanks in advance
rfmmars
27th February 2008, 16:09
This tapes was most likely made on a Studio Ampex Quad 2" 4 head machine. The video was put vertically on the tape, it was not wrap around the head like VHS or Beta. If the machine was in perfect adjustment, you don't see each track. A track only contained a fraction of a field, so what you are seeing is a color phase problem.
Using HDRagc you can play with the phase angle somewhat (x - y) to make it look better. Also some VHS Vdub plugins might be some help.
Richard
photorecall.net
kiwiusa
28th February 2008, 02:04
Thanks for the reply Richard, the SeeSaw you helped me out with earlier highlights this problem even better than LSF.
Any chance you could give me some pointers on how to use HDRAGC to alleviate this? I also tried fiddling around with cnr2 without success.
Al
IanB
28th February 2008, 02:26
If the artifacts are in a constant vertical position, (they seem to be at first glance in your snaps), you can possible build a mask then use it to merge the repaired area with the main image.
R3Z
28th February 2008, 02:50
Is it possible to post a small sample of say 150 frames?
kiwiusa
28th February 2008, 03:33
Is it possible to post a small sample of say 150 frames?
Sure, here is 100 raw frames after IVTC but before further processing.
http://rapidshare.com/files/95512254/100frame.avi
I also cropped some of the nastiness off the sides.
Thanks,
Al
MadRat
28th February 2008, 07:27
There happens to be an article on Doom9 about chroma nose that describes just this subject. http://www.doom9.org/index.html?/capture/chroma_artefacts.html But before you get too excited the article says:
At the time of writing this page, there are no filters who can correct this.
I suppose you could try throwing tcomb at it but tcomb is for removing rainbows and dot crawl and only works with interlaced video so if your video is progressive you must look else where. Odds are it won't work but an experiment will only take a moment so what's the harm?
Boulder
28th February 2008, 08:17
FFT3DFilter/FFT3DGPU can be used against rainbowing and chroma noise, they might be worth a try.
yup
28th February 2008, 14:13
Hi kiwiusa!
Try medianblur plugin for chroma (ml3dex functioon) and MVTools plugin for luma using MVDegrain1 function.
AVISource("source.avi")
AssumeTFF()# or AssumeBFF()
ConvertToYV12(interlaced=true)
fields=SeparateFields()
backward_vec = fields.MVAnalyse(isb = true, delta = 2, pel = 2, overlap=4, sharp=2, idx = 1,dct=1,chroma=false)
forward_vec = fields.MVAnalyse(isb = false, delta = 2, pel = 2, overlap=4, sharp=2, idx = 1,dct=1,chroma=false)
fc = fields.MVFlow(forward_vec, idx=1, thSCD1=500)
bc = fields.MVFlow(backward_vec, idx=1, thSCD1=500)
interleave(fc, fields, bc)
ml3dex(mc=false,Y=0,U=3,V=3)
chroma=SelectEvery(3,1)
fields.MVDegrain1(backward_vec,forward_vec,thSAD=400,idx=1,plane=0)# may increase thSAD for smoothing up to 800
MergeChroma(chroma)
Weave()
LetterBox(16,16,16,16)
this make good separation luma and chroma
yup.
kiwiusa
28th February 2008, 20:44
Thanks for all your replies.
Madrat: That article in doom9 discouraged me as well and unfortunately tcomb didn't help.
Boulder: FFt3filter actually made some difference, but I had to use a really high setting for the sigma in plane 2 (V) that it washes out outher parts of the video.
Yup: ml3dex didn't seem to help at all even with thSAD set at 800.
yup
29th February 2008, 08:07
kiwiusa!
Try increase motion compensation distance to 2 or even to 3 and use instead ml3dex medianblurt only in temporal plane for chroma.
backward_vec2 = fields.MVAnalyse(isb = true, delta = 4, pel = 2, overlap=4, sharp=2, idx = 1,dct=1,chroma=false)
backward_vec3 = fields.MVAnalyse(isb = true, delta = 6, pel = 2, overlap=4, sharp=2, idx = 1,dct=1,chroma=false)
the same for forward
calculate compensated
interleave(fc3,fc2,fc1, fields, bc1,bc2,bc3)
medianblurt(0,0,0,3)
SelectEvery(7,3)
instead MVDegrain1 use MVDegrain3
Also try make the same for bobed source, denoise and after reinterlace.
Upload 100 frames unprocessed source.
yup.
kiwiusa
29th February 2008, 21:33
kiwiusa!
Try increase motion compensation distance to 2 or even to 3 and use instead ml3dex medianblurt only in temporal plane for chroma.
backward_vec2 = fields.MVAnalyse(isb = true, delta = 4, pel = 2, overlap=4, sharp=2, idx = 1,dct=1,chroma=false)
backward_vec3 = fields.MVAnalyse(isb = true, delta = 6, pel = 2, overlap=4, sharp=2, idx = 1,dct=1,chroma=false)
the same for forward
calculate compensated
interleave(fc3,fc2,fc1, fields, bc1,bc2,bc3)
medianblurt(0,0,0,3)
SelectEvery(7,3)
instead MVDegrain1 use MVDegrain3
Also try make the same for bobed source, denoise and after reinterlace.
Upload 100 frames unprocessed source.
yup.
Thanks Yup, I'll give that a try shortly.
From Post 6 above:
Sure, here is 100 raw frames after IVTC but before further processing.
http://rapidshare.com/files/95512254/100frame.avi
Thanks, Al
Didée
29th February 2008, 22:30
That ain't work. The defect is of spatial nature, you can't combat it with a temporal filter. This needs spatial treatment. For a start, try DeVeed() with strong settings (on U+V planes in YV12 or YUY2 colorspace, don't use RGB).
kiwiusa!
First stage could be denoising and only after IVTC.
Didée!
I have VHS capture with the same problem and medianblurt attenuate color stripes. Best result I get using medianblurt(0,0,0,2) on bobed source.
Upload original capture before IVTC and make capture 720x480 YUY2 colorspace.
yup.
Didée
1st March 2008, 15:05
yup !! ;)
In the sample one can see that the colorstripes are basically stationary, exept for some minor fluctuations. Since the artefacts don't move around, they can not be averaged away by temporal averaging. Period.
Proof: original left, MVDegrain3 right:
http://www.hochladen.info/images/upload5/pAZf04dUa5Nj50S/thumb.png (http://www.hochladen.info/image/pAZf04dUa5Nj50S/) - http://www.hochladen.info/images/upload5/LaDfZbOSEmJfJJc/thumb.png (http://www.hochladen.info/image/LaDfZbOSEmJfJJc/)
Denoising has happened, sure, but the colorbands are hardly affected at all. That's exactly what's supposed to happen here. The bands don't move, so they'll only get stabilized by temporal filtering.
The better way here is using spatial filters:
1) DeVeed:
source.ConvertToYV12().DeVeed(rad=8,str=8,ry=false,gu=true,bv=true,force=true,pgu=10,ngu=10,pbv=10,nbv=10)
http://www.hochladen.info/images/upload5/BbFqyYuhIQr07a9/thumb.png (http://www.hochladen.info/image/BbFqyYuhIQr07a9/)
That's better. DeVeed does a very reasonable job here, and it runs relatively fast. It has some smaller issues, though. If you look close (use zooming), there are some not-processed lines coming through (saturated blue line in the background), and some color artefacts can be seen around the person's body.
2) Selfmade script: Multi-scale vertical half-clamping with horizontal response
http://www.hochladen.info/images/upload5/YHFfjv4NAbh358b/thumb.png (http://www.hochladen.info/image/YHFfjv4NAbh358b/)
Result is similar to DeVeed, but with less artefacts. Downside is it's quite a bit slower.
Version (2) with denoising and a bit of sharpening:
http://www.hochladen.info/images/upload5/tc0Tz3WhnrXnjXX/thumb.png (http://www.hochladen.info/image/tc0Tz3WhnrXnjXX/)
Is it good, or is it not ... I can't tell. With sources that contain so few detail, the end results always look "empty". To me, those things never look "good" in the end.
edit: the used script
AviSource("100frame.avi")
converttoyv12()
o=last
veed = o.deveed(rad=8,str=8,ry=false,gu=true,bv=true,force=true,pgu=10,ngu=10,pbv=10,nbv=10)
mds()
spline36resize(o.width(),o.height()/2/4*4)
mds()
spline36resize(o.width(),o.height()/6/4*4)
mds()
spline36resize(o.width(),o.height())
o.mergechroma(last)
s1 = last
diff = mt_makediff(o,last,U=3,V=3)
x1 = diff.crop(80,0,-0,-0).addborders(0,0,80,0,color=$808080)
x2 = diff.crop(0,0,-80,-0).addborders(80,0,0,0,color=$808080)
diff1a = diff.repair(x1,1)
diff1b = diff.repair(x2,1)
diff2 = mt_lutxy(diff1a,diff1b,"x 128 - abs y 128 - abs > x y ?",Y=2,U=3,V=3)
diff3 = mt_lutxy(diff,diff2,"x 128 - abs y 128 - abs < x y ?",Y=2,U=3,V=3)
nostripes = o.mt_makediff(diff3,Y=2,U=3,V=3)
nostripes2 = last .minblur(1) .limitedsharpenfaster(ss_x=1.0,ss_y=1.0,strength=200,soft=100,overshoot=5)
srchbase = nostripes2.fft3dfilter(sigma=6,sigma2=4,sigma3=3,sigma4=2,bt=5,bw=16,bh=16,ow=8,oh=8,plane=4) .fluxsmootht()
backward_vec = srchbase.MVAnalyse(isb = true, delta = 1, pel = 2, overlap=4, sharp=2, idx = 1, dct=0, chroma=true)
forward_vec = srchbase.MVAnalyse(isb = false, delta = 1, pel = 2, overlap=4, sharp=2, idx = 1, dct=0, chroma=true)
backward_vec2 = srchbase.MVAnalyse(isb = true, delta = 2, pel = 2, overlap=4, sharp=2, idx = 1, dct=0, chroma=true)
forward_vec2 = srchbase.MVAnalyse(isb = false, delta = 2, pel = 2, overlap=4, sharp=2, idx = 1, dct=0, chroma=true)
# backward_vec3 = srchbase.MVAnalyse(isb = true, delta = 3, pel = 2, overlap=4, sharp=2, idx = 1, dct=0, chroma=true)
# forward_vec3 = srchbase.MVAnalyse(isb = false, delta = 3, pel = 2, overlap=4, sharp=2, idx = 1, dct=0, chroma=true)
nostripes_MCNR = nostripes2.MVDegrain2(backward_vec,forward_vec,backward_vec2,forward_vec2,thSAD=300,idx=2,plane=4)
# which clip to return ...
#-------------------------
# o
# veed
nostripes
# nostripes_MCNR
return(last)
#==================
# helper function: vertical-only MinBlur with vertical radius 2
function mds(clip clp)
{
a = clp.mt_luts(clp,mode="median",pixels="0 -2 0 -1 0 0 0 1 0 2",Y=2,U=3,V=3)
b = clp.mt_convolution("0 1 0","1 2 1",y=2,U=3,V=3).mt_convolution("0 1 0","1 2 1",Y=2,U=3,V=3)
aD = mt_makediff(clp,a,Y=2,U=3,V=3)
bD = mt_makediff(clp,b,Y=2,U=3,V=3)
DD = mt_lutxy(aD,bD,"x 128 - y 128 - * 0 < 128 x 128 - abs y 128 - abs < x y ? ?",Y=2,U=3,V=3)
clp.mt_makediff(DD,Y=2,U=3,V=3)
return(last)
}
Didée!:)
We deal with processed source. I have some VHS which dubed from camcorder with same problem and approach median for chroma and degrain for luma work good (for me). I waiting when kiwiusa uploaded unprocesed source.Ordinary enough medianblurt(0,0,0,1) on fields in chroma plane.
yup.
I see Your script :)
kiwiusa
1st March 2008, 18:09
Thanks all for looking at this.
I have uploaded two more 100 frame clips prior to IVTC encoded with Huffy. I hope this helps.
http://rapidshare.com/files/96218029/OTEClip1.avi
http://rapidshare.com/files/96219018/OTEClip2.avi
Al
Edit.
Didée, I'm not sure of my terminology here, but did you notice how green seems to bleed out of the ice on the left hand side, and red bleeds into ice on the right hand side? Curious.
Now I agree that noise 2D not temporal. In my capture I frequently deal with colour flickering from field to field. May be can solve problem at capture step, using TBC (time base corrector)? Or problem from film source?
yup.
vBulletin® v3.8.11, Copyright ©2000-2026, vBulletin Solutions Inc.