Vtk point set registration

Does the ICP algorithm support deformable or non-rigid meshes?

ICP can only do rigid registration (with optional scaling).

If you have corresponding point pairs then you can do deformable landmark registration with vtkThinPlateSplineTransform.

If you have meshes with unknown point correspondences then you can compute non-linear warping from b-spline registration of distance maps computed from closed surface meshes. We tried various approaches and this worked the best for our applications. It was tested extensively on prostate US/MRI registration, used successfully in clinical work, and worked surprisingly well for other applications, too. All the necessary computation infrastructure is available in ITK toolkit. If you want to try if it works on your data without any programming, then you can use 3D Slicer’s SegmentRegistration extension.

@lassoan Thanks for letting me know. I’ve been looking at ITK. It seems very slow but I’m not sure if I’m implementing it correctly. I have about 30K points I need to register against.

In your experience does this algorithm take a lot of time? I was hoping it would be faster than CPD which is what I’m using now. but it does not seem like it is


Number of points actually does not matter, only the resolution of the grid that you use to compute the displacement field. Deformable image registration typically takes about half a minute but if performance is critical then there are many ways to reduce the time.

What is the typical execution time for CPD? Do you find it robust enough (always converges to correct solution within predictable time)?

@lassoan CPD could take several hours depending on my dataset. It doesn’t always converge… :-/ I think I’m not setting the correct resolution grid. But I also think I’m not correctly capturing my geometry of my isoSurface.

I have a bunch of questions out on the ITK forum :slight_smile: if you have any suggestions on how to improve my registration. I’d love to hear them.

That’s what I thought. Distance-map registration works so much better.

Can you post the link here?

Here are two links. I’d prefer to use a GPU implementation

I’m going to try to implement a DistanceMapImageFilter of some type now.

I don’t mind bringing the Dicom images into ITK but I do think I need VTK for some of the post processing.

Several distance map filters are already available in VTK and ITK.

Applications typically use VTK for visualization and if needed then ITK for advanced image processing, registration, and segmentation. You can connect ITK and VTK pipelines using ITKVTKGlue.

1 Like

I tried to use this but I am getting some errors, basically all operations of performRegistration using movingVolumeNode and others are not set.
I am new to slicer, this is the aprroach I am following.
Model -> segmentation Node -> Segmentation registration.
Is this wrong, or am I missing out on something?

Could you post these Slicer-specific questions to the Slicer forum? Thanks!

Hi, I would appreciate it if you could share an example in Python about how to use vtkThinPlateSplineTransform for point-to-point registration. Does Slicer use this module to apply point-to-point registration? Thanks

Yes, 3D Slicer uses vtkThinPlateSplineTransform in its Transforms module to warp images, segmentations, models, markups, etc.

You can try non-linear warping with a convenient user interface by using the “Fiducial registration wizard” module in SlicerIGT extension. You can check out the “U-12 Landmark registration” tutorial on the SlicerIGT training page.

There are many other, more specialized warping modules that rely on this class. For example, Baffle Planer module in SlicerHeart extension is used for warping a thin (or thick) membrane to match an arbitrary-shaped surface specified by a boundary curve and surface points: