Re: Image resampling [PATCH 0/6]

Behdad Esfahbod <[email protected]>
Newsgroups gmane.comp.graphics.pixman,gmane.comp.lib.cairo
Message-ID <[email protected]>
Hi Søren,

This is a very well done patchset with great commentary.  Great job!

Cheers,
behdad

On 12-11-23 10:57 PM, Søren Sandmann wrote:
> Hi,
> 
> Reviewing the supersampling patch here:
> 
>    http://cgit.freedesktop.org/~ajohnson/pixman/log/?h=supersampling
> 
> I wasn't happy with either the performance and image quality, and I
> realized that the whole supersampling approach just isn't going to
> fly. Since I told people to do it that way, I apologize for that. The
> approach advocated by Bill Spitzak in the various downsampling threads
> of computing a convolution kernel up front, is the much better way to
> go. To make up for being misleading, the following patches implement
> comprehensive support for high-quality image scaling filters.
> 
> Pixman already has a convolution filter, but since it only allows one
> sample per pixel of the filter, it is limited in the quality that it can
> support, so the following patches (to be applied on top of the three
> rounding patches) add a new filter type
>     
>     PIXMAN_FILTER_SEPARABLE_CONVOLUTION
> 
> that supports multiple different convolution matrices that are chosen
> between based on the subpixel source location. The matrices are
> specified as tensor products of x/y vectors, which makes them
> separable by definition.
> 
> The patches also add a helper function
> 
>     pixman_filter_create_separable_convolution()
> 
> that will create the parameters for the filter based on scaling
> factors, filter kernels and subsampling resolution. Currently the
> supported kernels are impulse, box, linear, cubic
> (Mitchell-Netravali), lanczos2, lanczos3, lanczos3_stretched
> (aka. Blinn's 'Nice' filter), and Gaussian.
> 
> There also a new demo program "demos/scale" that shows how
> the new API can be used.
> 
> For some useful math regarding image transformations, see
> http://people.redhat.com/otaylor/gtk/pixbuf-transform-math.ps . For
> some informatino about how to compute the convolution matrices, see
> the additions to rounding.txt in the second patch.
> 
> 
> -=- Adding support to cairo and further work
> 
> Once these patches have landed in Pixman, support will have to be
> added to cairo to make use of them. How to do that exactly requires
> figuring out what new API to offer, and how the tradeoffs between
> performance and quality should be made. This is not something that I
> personally plan to work on anytime soon, except to make three notes:
> 
>   - While transformations that are not pure scalings will not
>     generally result in a separable filter, OK-looking results for
>     non-scalings can be achieved by using scaling factors based on the
>     bounding box of a transformation 
> 
>   - For equivalent quality to GdkPixbuf do this: In each direction
>     compute the scaling factors and then, if the scaling factor is
>     less than 1 (ie., a downscaling), use PIXMAN_KERNEL_BOX for both
>     reconstruction and sampling, and if it's greater than one, use
>     PIXMAN_KERNEL_LINEAR for reconstruction and PIXMAN_KERNEL_IMPULSE
>     for sampling.
> 
>   - If PIXMAN_KERNEL_GAUSSIAN is used with large downscaling factors
>     and the resulting filter is then used with an identity transform,
>     the result is a Gaussian blur, which is a feature that has
>     sometimes been requested.
> 
> The code in demos/scale.c may be useful as an example.
> 
> 
> -=- Further work and examples
> 
> There is some additional work that could be done:
> 
> - Performance improvements. Low-hanging fruit includes adding new fast
>   path iterators that assume the source is a8r8g8b8 or r5g6b5. Higher
>   hanging fruit is SIMD optimziations and implementations that take
>   advantage of separability. It may also be interesting to speed up
>   pixman_filter_create_separable_convolution() by tabularizing some of
>   the trigonometric functions etc.
> 
> - A non-separable, but subsampled, convolution filter type could be
>   interesting to allow correct filters for non-scaling transformations
>   and non-separable filters in general.
> 
> 
> As a reward for reading this entire mail, here are some images:
> 
> Original (2.6 MB):
> 
>          http://www.daimi.au.dk/~sandmann/house.jpg
> 
> Scaled down 12.9 times in each dimension:
> 
> - With a box filter:
> 
>            http://www.daimi.au.dk/~sandmann/house-box.png
> 
> - With Lanczos3:
> 
>            http://www.daimi.au.dk/~sandmann/house-lanczos3.png
> 
> - With stretched Lanczos3:
> 
>            http://www.daimi.au.dk/~sandmann/house-nice.png
> 
> For more examples, try demos/scale.
> 
> The patch series is also available in this repository:
> 
>     http://cgit.freedesktop.org/~sandmann/pixman/log/?h=separable
> 
> 
> Soren
> _______________________________________________
> Pixman mailing list
> [email protected]
> http://lists.freedesktop.org/mailman/listinfo/pixman
> 

-- 
behdad
http://behdad.org/
_______________________________________________
Pixman mailing list
[email protected]
http://lists.freedesktop.org/mailman/listinfo/pixman
lmpx.com only provides a reader for public news (NNTP) servers. It is not affiliated with the servers or forums shown here and is not responsible for the content of articles, which is written by their respective authors.