Interpolating/crossfading a stack of matrices
raphael at mameghani.de
raphael at mameghani.de
Fri Jan 11 07:20:10 EST 2013
>> Hi,
>>
>> I want to interpolate (with quadratic splines) a stack of 2D-arrays/matrices
>> y1, y2, y3, ... in a third dimension (which I call x) e.g. for crossfading
>> images. I already have a working code which unfortunately still contains two
>> explicit loops over the rows and colums of the matrices. Inside these loops I
>> simply use 'interp1d' from scipy suitable for 1D-interpolations. Is anybody
>> here aware of a better, more efficient solution of my problem? Maybe
>> somewhere out there a compiled routine for my problem already exists in a
>> python library... :-)
> Since numpy arrays make it so easy to form linear combinations of
> arrays without loops I would probably eliminate the loops and just
> form the appropriate combinations of the image arrays. For example, to
> use linear interpolation you could do:
>
>
>
> def interp_frames_linear(times, frames, t):
>
> '''times is a vector of floats
>
> frames is a 3D array whose nth page is the image for time t[n]
>
> t is the time to interpolate for
>
> '''
>
> # Find the two frames to interpolate between
>
> # Probably a better way of doing this
>
> for n in range(len(t)-1):
>
> if times[n] <= t < times[n+1]:
>
> break
>
> else:
>
> raise OutOfBoundsError
>
>
>
> # Interpolate between the two images
>
> alpha = (t - times[n]) / (times[n+1] - times[n])
>
> return (1 - alpha) * frames[:, :, n] + alpha * frames[:, :, n+1]
>
>
>
> I'm not really sure how quadratic interpolation is supposed to work
> (I've only ever used linear and cubic) but you should be able to do
> the same sort of thing.
>
> Oscar
Indeed, the 'manual' reimplementation of the interpolation formula using numpy arrays significantly sped up the code. The numexpr package made it even faster. Thanks a lot for your advice!
Raphael
More information about the Python-list
mailing list