HorizontalReduceBy2 / VerticalReduceBy2 / ReduceBy2

HorizontalReduceBy2 (clip)
VerticalReduceBy2 (clip)
ReduceBy2 (clip)

HorizontalReduceBy2 reduces the horizontal size of each frame by half, and VerticalReduceBy2reduces the vertical size by half. Chain them together (in either order) to reduce the whole image by half. You can also use the shorthand ReduceBy2, which is the same as HorizontalReduceBy2followed by VerticalReduceBy2.

The filter kernel used is (1/4,1/2,1/4), which is the same as in VirtualDub's "2:1 reduction (high quality)" filter. This avoids the aliasing problems that occur with a (1/2,1/2) kernel. VirtualDub's "resize" filter uses a third, fancier kernel for 2:1 reduction, but I experimented with it and found that it actually produced slightly worse-looking MPEG files--presumably because it sharpens edges slightly, and most codecs don't like sharp edges.

If your source video is interlaced, the VerticalReduceBy2filter will deinterlace it (by field blending) as a side-effect. If you plan to produce output video in a size like 320x240, I recommend that you capture at full interlaced vertical resolution (320x480) and use VerticalReduceBy2. You will get much better-looking output. My Huffyuv utility will compress captured video about 2:1, losslessly, so you can capture 320x480 in about the same space as it used to take to capture 320x240. (If your disk has the capacity and throughput to support it, you can even capture at 640x480 and use both HorizontalReduceBy2and VerticalReduceBy2. But this won't improve the quality as much, and if you have to go to MotionJPEG to achieve 640x480, you're probably better off with Huffyuv at 320x480.)

Note that, it's a quick and dirty filter (performance related compromise). Unlike the standard resize filters, the ReduceBy2filters do not preserve the position of the image center. It shifts color planes by half of pixel. In fact, ReduceBy2()is equivalent to:

BilinearResize(Width/2, Height/2, 0.5, -0.5) for RGB,

MergeChroma(BilinearResize(Width/2,Height/2,0.5,0.5),BilinearResize(Width/2,Height/2,1.0,1.0)) for YV12,

MergeChroma(BilinearResize(Width/2,Height/2,0.5,0.5),BilinearResize(Width/2,Height/2,1.0,0.5)) for YUY2.

$Date: 2008/12/24 19:19:07 $