ThinPlateSpline class
Fits a thin plate spline function to a set of points. Useful for interpolation of scattered points.
Contents
This class implements a generalization of the 2D thin plate spline to arbitrary dimensionality. The
constructor builds the thin plate spline function, and the Evaluate
method evaluates this function
at a given point.
Constructors, destructors, assignment and conversion operators
- ThinPlateSpline(dip::FloatCoordinateArray coordinate, dip::FloatCoordinateArray const& value, dip::dfloat lambda = 0)
- Creates a function that maps
coordinate
tovalue
.
Functions
- auto Evaluate(dip::FloatArray const& pt) -> dip::FloatArray
- Evaluates the thin plate spline function at point
pt
.
Function documentation
ThinPlateSpline(dip::FloatCoordinateArray coordinate, dip::FloatCoordinateArray const& value, dip::dfloat lambda = 0)
Creates a function that maps coordinate
to value
.
coordinate
gives the spatial location of samples, and value
their values. The thin
plate spline function therefore maps coordinate
to value
. value[ ii ]
corresponds to
coordinate[ ii ]
, both arrays must have the same number of elements.
This function also expects coordinate
and value
to have the same dimensionality. That is,
they both represent spatial coordinates in the same image. Internally, the function maps
coordinate
to value - coordinate
, Evaluate( pt )
adds pt
to the interpolated
value at pt
, and thus it looks externally as if the function maps to value
rather than
value-coordinate
. This improves extrapolation.
To use this class for warping, set coordinate
to control points in the fixed image, and value
to corresponding points in the floating image. Then, for each point in the fixed image,
Evaluate
will return the corresponding coordinates in the floating image, which can be
used to sample it.
If lambda
is larger than 0, the mapping is not exact, leading to a smoother function.
When applied with a large coordinates array, this constructor can take quite a long time. It is worth while to split up such a problem into blocks.
The first input argument, coordinate
, is taken by value and stored inside the object. Use
std::move
to pass this argument if you no longer use it later.