[Image-SIG] Image warping in Python or PIL
fredrik at pythonware.com
Sat May 8 13:49:14 CEST 2010
On Sat, May 8, 2010 at 5:58 AM, Son Hua <songuke at gmail.com> wrote:
> Can anybody show me some hints on how to implement an image warping function
> efficiently in Python or PIL? Suppose we have a function f(x, y) -> (x', y')
> that warps a pixel location (x, y) to (x', y'). Because (x', y') may end up
> to be non-integer, and many (x, y) can map to the same (x', y'), reverse
> mapping is used. That is at every destination pixel (x', y'), we go and find
> the original pixel location (x, y) by taking (x, y) = f_1(x', y'), where f_1
> is the inverse function of f.
> Suppose the inverse function f_1 is given. So, for each pixel in the
> destination image, we can map to a non-integer pixel in the source image.
> Therefore, we must bilinear interpolate at the source location for the
The transform(MESH) operation might be what you need.
Instead of mapping between individual pixels, cover the output image
with a grid, and calculate the source pixels for the corners of each
grid rectangle (forming a quadrilateral area). Pass in the resulting
list of (grid rectangle, quadrilateral) pairs to transform(MESH), and
it'll take care of the rest.
(you can use a generator to produce mesh pairs on the fly)
The result is (usually) an approximation, with the maximum error
controlled by the grid resolution.
More information about the Image-SIG