Non-rigid registration of two surface meshes with non-corresponding vertices

Hi Everyone,

I have a bunch of beginner’s questions about what ITK can/cannot do.

We have a bunch of 3-D surface meshes (different faces, each with a bunch of different facial expressions). Different meshes have different number of vertices. We want to register these meshes pairwise. Obviously, this is just a case of non-rigid registration.

So my questions are:
(1) Can ITK do this sort of non-rigid registration (two surface meshes with mutually different number of vertices, i.e., no-corresponding vertices)?
(2) Is ITK the best tool for doing something like this, or should we be looking at something else? (If so, which?)
(3) Is there demo code available for how to do this?
(4) Is there an “ITK for Dummies”, especially something that explains to someone who is a programmer but an ITK outsider as to what ITK can and cannot do.

Many thanks in advance,

ITK can do it, look at e.g. IterativeClosestPoint2.cxx example.

ITK specializes in image processing, VTK might be a better match for this task. VTK does mesh processing, among other things.

For an overview, you could look at Abstract or System Overview chapter of ITK software guide.

Thank you so much! This is extremely helpful!


As far as I know, ICP can only do rigid registration.

You can non-linearly register meshes by converting them to binary masks, computing distance maps from them, and non-linearly register these distance maps (there are ITK functions for all these). However, points will be matched to close surface point and not necessarily provide anatomical match (e.g., a on a mesh of a wide smile, corner of the mouth may be mapped to mesh points on the cheek).

For anatomically correct non-rigid registration, you can identify anatomical landmarks and compute thin-plate-spline transform from these. The transform then provides correspondence for all the mesh points.

1 Like

This is true in other libraries, but this is not true for ITK. In ITK, any of the many parameterized spatial transformations can be used, including multi-dimensional b-splines and dense displacement fields.

ITK also has better similarity metrics than ICP. See @ntustison paper on the information-theoretic metric. This was recently improved by Sam Gerber for common cases where there is a great imbalance between the point sets.

1 Like

Thank you, it’s good to know!

Important: If it is a new algorithm then it must have a new name. Taking the name of an existing well-known algorithm and attaching it to something else would cause a lot of confusion. This topic is just one example of that.

Technically, the library component is called itk::PointSetToPointSetRegistrationMethod. The example is called IterativeClosestPoint, because that is what it boils down to with rigid transform. Also to make it easier to find, as that is a well known name.

Hi @lasson,

Some “historical” perspective: ITK’s implementation is not ICP (Besl, McKay). I remember discussing this with Luis Ibanez more than a decade ago. It is actually closest to the paper by Fitzgibbon.

The naming is indeed unfortunate, but it has been this way almost longer than the age of the average ITK user :wink: . So like many things, it’s this way because of historical reasons.

The issue is that if I see “iterative closest point” class name then I (and probably many others) do not even have a closer look at the class because I already know what the class does and how. It essentially makes a good ITK feature invisible.

This can be still fixed. The class could be renamed and the old name could be deprecated now and removed in 5-10 years.