[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