Re: Concerns about using filters for downscaling
[email protected] (Søren Sandmann)
| Newsgroups | gmane.comp.lib.cairo |
|---|---|
| Message-ID | <[email protected]> |
Bill Spitzak <[email protected]> writes: > I'm also still mystified by the "two filters" approach. I have no idea > what you mean by the sampling and reconstruction filter. I have done a > lot of image processing, and transformations only use *one* filter, > called the "sampling filter". This filter changes depending on the > scale and on the fractional portion of the sample point. Say that we want to transform a source image with a transformation that is a downscale in one dimension and an upscale in another. Consider the untransformed source image in the frequency domain. It is made up of pixels, so its Fourier transform consists of the baseband replicated to infinity. In order to transform the image, we conceptually need to do four things: (a) Get rid of the replicated copies of the baseband. This is done by lowpass filtering so that only one copy remains. (b) Transform the image. This will distorts the one remaining baseband copy so that it becomes bigger in one dimension and smaller in another. Parts of it will now stick out outside the baseband. (c) Lowpass filter again to get rid of the bits of baseband copy that ended up outside the baseband square. Otherwise those bits will cause aliasing in the next step. (d) Sample the image; this will once again replicate the baseband to infinity. Step (a) is a reconstruction filter, step (c) is a sampling filter. Both are necessary. If you leave out step (a) you will get extra copies of baseband in the final result -- in an extreme form this is what you get if you upscale an image with insufficient interpolation: tiny dots on a black background. If you leave out step (c) you get aliasing artefacts, which is what we all know from current cairo. Now, when the transform is affine, all the four steps can be combined into one by convolving the two filters, and this is what pixman does. You need to read and understand the code in pixman-filter.c and the bits_image_fetch_pixel_separable_convolution() function in pixman-bits-image.c. If you are still "mystified" after that, feel free to ask questions, but I am not going to write any further emails unless I see evidence that you understand what the pixman code is actually doing. Søren -- cairo mailing list [email protected] http://lists.cairographics.org/mailman/listinfo/cairo