[SciPy-User] evaluating B-Splines made with scipy.signal.cspline2d?

Zachary Pincus zachary.pincus at yale.edu
Wed Nov 9 09:16:21 EST 2011


Hi Kay,

This doesn't answer your specific question, but look at scipy.ndimage.map_coordinates() for general-purpose spline interpolation of regularly-spaced (e.g. image) data. If you want to repeatedly interpolate the same data, you can get the spline coefficients with:
scipy.ndimage.spline_filter() and pass them to map_coordinates() with the "prefilter=False" option.

It is curious that while scipy.signal has cspline1d() and cspline1d_eval(), there is no cspline2d_eval() function... hopefully someone else can weight in on what's going on here.


Zach


On Nov 9, 2011, at 4:16 AM, Kay F. Jahnke wrote:

> Hi group!
> 
> in brief: I'm looking for an efficient way to evaluate B-splines generated by
> scipy.signal.cspline2d() at arbitrary float coordinates to interpolate image
> data.
> 
> I am doing image processing and need a method to interpolate an image at
> arbitrary float coordinates. Scipy.signal kindly provides a fast and efficient
> routine to calculate spline coefficients, but the module seems not to adress
> using this spline for interpolation.
> 
> I have written some code to calculate the interpolated value at arbitrary
> positions, but this code is cumbersome and slow - I have to calculate the
> value of the basis function 8 times (I suspect that takes a good while using
> signal.bspline(), haven't done any measurements), plus a fair bit of matrix
> manipulation to pick the relevant window of spline coefficients to multiply
> with the basis function values - my code (without any frills or checks,
> just to convey the basic idea) looks like this:
> 
> # assume the spline coefficients are in a 2D array 'cf'
> # and (x,y) is the position to interpolate at
> 
> def cf_matrix ( cf , x , y ) :
>    return cf [ x - 1 : x + 3 , y - 1 : y + 3 ]
> 
> def base_matrix ( x , y ) :
>    x0 = x - floor ( x )
>    y0 = y - floor ( y )
>    rng = arange ( 1 , -3 , -1 )
>    xv = rng + x0
>    yv = rng + y0
>    xb = signal.bspline ( xv , 3 )
>    yb = signal.bspline ( yv , 3 )
>    xx , yy = meshgrid ( xb , yb )
>    return xx * yy
> 
> def interpolate ( cf , x , y ) :
>    m = cf_matrix ( cf , x , y )
>    b = base_matrix ( x , y )
>    return sum ( m * b )
> 
> obviously this is fine to use for a few hundred points or so, but for real
> images it's not practical.
> 
> In Scipy.interpolate, there is scipy.interpolate.bisplev() to evaluate the
> splines generated by scipy.interpolate.bisplrep(), but these splines are of
> the more general form with arbitraryly spaced knot points, therefore the
> relevant data structures contain the knot vectors, and I assume that all sorts
> of performance gains that could be derived from the fact that the splines from
> the signal package are using equally-spaced samples are inapplicable in the
> general case.
> 
> I'd appreciate suggestions on how to proceed or hints at what I'm missing.
> 
> _______________________________________________
> SciPy-User mailing list
> SciPy-User at scipy.org
> http://mail.scipy.org/mailman/listinfo/scipy-user




More information about the SciPy-User mailing list