I originally posted this question on SimpleITK’s GitHub issues page, but became reminded about the Discourse forum while watching a SITK tutorial (somehow I completely forgot that the forum exists!). I’m re-posting it here hoping to reach a wider audience (and hopefully someone who’s done this before and knows where I’m going wrong).
I am aware of
sitk.BSplineTransformInitializer(image1, transformDomainMeshSize, order) for performing BSpline registrations, but I am trying to initialize the registration using
Following is how I attempt to obtain a landmark-based transform for a ‘rigid’, ‘affine’ or ‘bspline’ transforms:
def GetLandmarkTx(FixIm, MovIm, FixPts, MovPts, Transform='rigid', NumControlPts=8): import SimpleITK as sitk if Transform == 'rigid': SitkTransform = sitk.VersorRigid3DTransform() elif Transform == 'affine': SitkTransform = sitk.AffineTransform(FixIm.GetDimension()) elif Transform == 'bspline': SitkTransform = sitk.BSplineTransform(FixIm.GetDimension()) else: msg = "Transform must be either 'rigid', 'affine' or 'bspline'." raise Exception(msg) if Transform == 'bspline': LandmarkTx = sitk.LandmarkBasedTransformInitializer(transform=SitkTransform, fixedLandmarks=FixPts, movingLandmarks=MovPts, referenceImage=FixIm, numberOfControlPoints=NumControlPts) else: LandmarkTx = sitk.LandmarkBasedTransformInitializer(transform=SitkTransform, fixedLandmarks=FixPts, movingLandmarks=MovPts, referenceImage=FixIm) return LandmarkTx
The above works fine for ‘rigid’ and ‘affine’, but the following error occurs for ‘bspline’:
Exception thrown in SimpleITK LandmarkBasedTransformInitializer: C:...itkMultiThreader.cxx:395: itk::ERROR: MultiThreader: Exception occurred during SingleMethodExecute
Unfortunately I’ve not been able to find any examples that use
LandmarkBasedTransformInitializer for non-rigid registrations, so I’m not sure if I’m taking the correct approach. Any advice would be much appreciated.