[Insight-users] BSplineInterpolateImageFunction and Offset
maquette
maquette at lavabit.com
Mon Jan 31 18:44:51 EST 2011
hi, I have a problem using BSplineInterpolateImageFunction on an Image
where the Index
of the buffered region is NOT (0,0). I'm talking about the start Index.
This causes ApplyMirrorBoundaryConditions to compute evaluateIndex the
wrong way. Then it
contains indices outside the buffered region and crashes in silence.
In my opinion the class can not work as long as it only uses
InputImage->GetBufferedRegion->GetSize() and
BSplineInterpolateImageFunction is ignored.
My next thought was, that I did not understand ContinuousIndex right. Is
it relative to the image origin, or relative to the buffered regions offset?
So I used the "frontend" functions provided by itk::Image for this
example (failes) and see that the continuous index is approximately the
same as physical point
and the integer index:
-----SNIP---------
const unsigned int NDimensions = 2;
typedef unsigned char PixelT;
typedef itk::Image<PixelT, NDimensions> ImageT;
typedef ImageT::IndexType ImageIndexT;
typedef ImageT::Pointer ImagePointerT;
typedef ImageT::RegionType ImageRegionT;
typedef ImageT::SizeType ImageSizeT;
typedef ImageT::OffsetType ImageOffsetT;
typedef ImageSizeT::SizeValueType SizeValueT;
typedef ImageIndexT::IndexValueType IndexValueT;
typedef ImageOffsetT::OffsetValueType OffsetValueT;
// test the bspline
typedef itk::BSplineInterpolateImageFunction<ImageT> BSplineFunctionT;
BSplineFunctionT::Pointer F = BSplineFunctionT::New();
F->SetSplineOrder(1);
// use a region "far out" but with small size, image is very
elongated in dimension 0
SizeValueT chunksize( 1024*1024 ); // 1MiB
// about the end of signed 64bit range:
const SizeValueT largeIntegerOffset( 4503599627369471 );// double
mantissa can still resolve points between image gridpoints
const OffsetValueT chunklocation = largeIntegerOffset - chunksize; //
test starts below
ImageOffsetT testOffset = {{chunksize-100, 0}}; // offset within
chunk (near the end)
ImageIndexT zero = {{ testlocation, 0}}; // start of chunk
in image coordinates
ImageSizeT size = {{ chunksize, 1 }}; // size of chunk
ImageIndexT testLocation = zero + testOffset; // start of test
sequence in image coordinates
ImageRegionT largeRegion(zero,size);
// chose a bigger largest possible region starting from 0,0 size
largeIntegerOffset,1
ImageIndexT LPRzero = {{ 0, 0 }};
ImageSizeT LPRsize = {{ largeIntegerOffset, 1}};
ImageRegionT LPR( LPRzero, LPRsize );
ImageT::Pointer large = ImageT::New();
large->SetRegions(largeRegion);
large->SetLargestPossibleRegion(LPR);
large->Allocate();
// large as input to the interpolator
F->SetInputImage(large);
BSplineFunctionT::ContinuousIndexType cidx;
ImageT::PointType point;
// OK use official functions to translate from Index to Point to
continuous Index
// double is used as default realtype in point and cidx
large->TransformIndexToPhysicalPoint( testLocation, point );
// debugger: point[0] == 4503599627369371.0
large->TransformPhysicalPointToContinuousIndex( point, cidx );
cidx[0] += 0.5;
// debugger: cidx[0] == 4503599627369371.5
PixelT interpolate = F->EvaluateAtContinuousIndex(cidx); // CRASH!
// in BSplineInterpolateImageFunction::EvaluateAtContinuousIndex(x)
// ...
// ApplyMirrorBoundaryConditions() seems to mess up EvaluateIndex,
negative index occurs
// ...
// interpolated += w * m_Coefficients->GetPixel(coefficientIndex);
--------------------------
So to clear things up:
1) how is ContinuousIndex supposed to work? relative to what?
2) if its relative to image origin (ImageBase::TransformXToY functions
seem to indicate this):
can BSplineInterpolateImageFunction be fixed by
storing the buffered region INDEX of the input image AND
( in EvaluateAtContinuousIndex: subtract index from x, and add it
somewhere (where?) else XOR
use index only within ApplyMirrorBoundaryConditions() )
3) I dont get it how m_Coefficients is to be used...
More information about the Insight-users
mailing list