.. _SurfaceBasedRegistration:
Surface-Based Registration
==========================
Watch videos:
Examples - Surface Registration with Medtronic Stealthstation ENT
^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
.. raw:: html
Examples - Surface Registration with Pathfinder
^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
.. raw:: html
Examples - Surface Registration with Brainlab Z-touch
^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
.. raw:: html
Surface Reconstruction Methods:
* Dragging a pointer
* Laser-Pointer like Brainlab Z-touch
* Laser pointer [Fusaglia2016]_
* Stereo vision, surface reconstruction, stitching [Thompson2015]_
Key Papers
^^^^^^^^^^
* ICP Algorithm. [BeslMcKay1992]_.
* Variations for anisotropic noise, e.g. [LenaMaierHein2011]_
* Extensions to global alignment, e.g. [Yang2015]_
Algorithm - Iterative Closest Point (ICP)
^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
From section IV (A) in [BeslMcKay1992]_, they define:
* Data ( :math:`P` with :math:`N_p` points ) == Moving
* Model ( :math:`X` with :math:`N_x` points ) == Fixed
The algorithm incrementally updates a moving point set, performing the following steps 1-4 in a loop.
:math:`k` is the iteration counter.
0. Create Transformed Moving point set == Moving.
1. For each point in Transformed Moving point set, compute closest point in Fixed point set.
2. Compute Point-Based registration, mapping Original Moving to Fixed,
3. Apply transform to Original Moving to generate a new Transformed Moving
4. Terminate iteration when change in mean squared error < threshold
i.e.
0. Set :math:`P_0 = P`
1. Compute :math:`Y_k = C(P_k, X)`
2. Compute :math:`(q_k, d_k) = Q(P_0, Y_k)`
3. Apply :math:`P_{k+1} = q_k(P_0)`
4. Stop if :math:`d_{k} - d_{k+1} < \tau`, else go to 1
Works for points, line segments, curves, anything that can be converted to
be compatible with the concept of having a "closest point".
Failure Modes
^^^^^^^^^^^^^
Mainly a discussion:
* Where can this go wrong?
* What are obvious failure modes?
Optimisations
^^^^^^^^^^^^^
Worse case performance, finding the closest point is :math:`O(N_p * N_x)`.
* Line minimisations, see [BeslMcKay1992]_
* Parallelism (OpenMP)
* Faster point search - :ref:`additional_resources:Algorithm - K-D Tree`, mentioned in [Zhang1994]_ who also proposed ICP.
.. raw:: html