[Insight-users] bug in BSplineInterpolationWeighFunction?

Stefan Klein stefan at isi.uu.nl
Thu Oct 12 10:34:04 EDT 2006


Hi,

In addition to my previous mail: in the BSplineInterpolateImageFunction the 
startIndex is computed differently than in the 
BSplineInterpolationWeightFunction.

Method: DetermineRegionOfSupport

The following code does the work:


   long indx;

// compute the interpolation indexes
   for (unsigned int n = 0; n< ImageDimension; n++)
     {
     if (splineOrder & 1)     // Use this index calculation for odd splineOrder
       {
       indx = (long)vcl_floor((float)x[n]) - splineOrder / 2;
       for (unsigned int k = 0; k <= splineOrder; k++)
         {
         evaluateIndex[n][k] = indx++;
         }
       }
     else                       // Use this index calculation for even 
splineOrder
       {
       indx = (long)vcl_floor((float)(x[n] + 0.5)) - splineOrder / 2;
       for (unsigned int k = 0; k <= splineOrder; k++)
         {
         evaluateIndex[n][k] = indx++;
         }
       }
     }


I think this behaves exactly like the solution I proposed in my previous 
mail, but distinguishes between the cases of odd and even spline order (so 
might be slightly less efficient?; especially since the function is often 
invoked many times).

Let me know what you think about it.

Regards!
Stefan.



At 15:01 12/10/06, Stefan Klein wrote:
>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.
>
>_______________________________________________
>Insight-users mailing list
>Insight-users at itk.org
>http://www.itk.org/mailman/listinfo/insight-users

-------------- next part --------------
An HTML attachment was scrubbed...
URL: http://public.kitware.com/pipermail/insight-users/attachments/20061012/02d34bef/attachment-0001.html


More information about the Insight-users mailing list