[Insight-users] bug in BSplineInterpolationWeighFunction?
Stefan Klein
stefan at isi.uu.nl
Thu Oct 12 09:01:22 EDT 2006
Hi,
I think i found a bug in the implementation of the
BSplineInterpolationWeightFunction.
In the Evaluate function, at lines 146-151, the startIndex of the support
region is computed, given a continuous input index (denoted by 'index'):
// Find the starting index of the support region
for ( j = 0; j < SpaceDimension; j++ )
{
startIndex[j] = static_cast<typename IndexType::IndexValueType>(
BSplineFloor( index[j] - static_cast<double>( SplineOrder / 2 ) ) );
}
If I understand well, for a zero order bspline, this formula should result
in a 'round' operation. This is not the case with the formula above:
suppose the continuous input index = 0.9 and the SplineOrder = 0.
then:
startindex = floor( 0.9 - 0/2 ) = floor (0.9) = 0.
Consequently, in line 161, where the bsplinekernel weight is evaluated, the
result is zero.
BsplineZeroOrder( inputindex - startindex ) = BSplineZeroOrder( 0.9 ) = 0.0.
Which must be wrong, since for a zeroth order bspline the weight value
should be nonzero everywhere in its support region.
For splineorder=1 the formula works. For splineorder=2 it goes wrong again
and for splineorder=3 it works. So, it's wrong for even spline orders.
I suggest changing it to:
startIndex = floor( inputIndex + bsplineoffset )
where
bsplineOffset = 0.5 - static_cast<double>(SplineOrder) / 2.0 ;
which results in bsplineOffset = 1/2, 0, -1/2, or -1 respectively for order
0, 1, 2, and 3.
In the case of zero order bspline this obviously gives the desired round
operation (floor(input+0.5)).
In general: for odd spline orders it works the same as the current formula,
but for even orders the result is different.
Please let me know if I made a mistake, or if it's really a bug.
Kind regards,
Stefan.
More information about the Insight-users
mailing list