I am trying to align two surfaces derived from medical images of patient blood vessels (actually, the same patient at two time points):
Because of vessel remodeling i.e., dilation due to growth, ICP does not seem appropriate. In fact, these surfaces have already been aligned using some ICP-type algorithm in a commercial software. I’ve read briefly that the Procrustes Alignment algorithm has been used to match disparate geometries with matching landmarks like human faces. But vtkProcrustedAlignmentFilter fails completely when applied to these two geometries.
Specifically, what happens is that the output provides absolutely no change, which seems strange (Figure 2). No change in points is found when comparing the points using the numpy_interface, like below:
>>> (surf2_before_procrustes.Points == surf2_after_procrustes.Points).all() True
Figure 2: Attempted alignment of two geometries. Left: Original, Middle: After Procrustes, Right: After ICP
To test if I was even using it correctly, I ran both the example from the documentation, and a case where one of the surfaces was manually transformed in ParaView. For both these cases, the filter does work (Figure 3).
Figure 3: Attempted alignment of the same geometry after rigid transformation.
For comparison, I also tried vtkIterativeClosestPointTransform. For the second case (Figure 3, right view), it failed completely. I’ve used it before and the results have been inconsistent. Are there any best practices when performing ICP?
To sum it up, my questions are:
- Why does vtkProcrustesAlignmentFilter fail completely? Shouldn’t there be even a slight transformation?
- How similar do the geometries have to be for Procrustes Alignment to work, either in VTK or in general?
- Does anyone better versed than I am in computational geometry have any better suggestions for aligning these geometries?