[Insight-users] [Fwd: Question Regarding ICP]

dlm19 at duke.edu dlm19 at duke.edu
Fri Oct 12 15:34:33 EDT 2007


Rushin,

Wes is correct, the ICP iterates through every moving point set and 
tries to calculate the distance to the closest fixed point.  As such, 
outliers in the Moving point set will skew your data, while outliers in 
your Fixed Point set will not.  This is a bit backwards from what the 
other registration methods do, which means that your transformation 
parameters are also inverted.  Instead whatever you initialize your 
parameters to should be the inverse of what you normally would invert 
them to, and any final processing steps (e.g., resampling the moving 
image), should be done on the inverse parameters (call the GetInverse() 
of the transform when you pass it into the ResampleImageFilter (if 
indeed your goal is to resample the image where the moving point set 
originated from)).   (e.g., if your moving point set is shifted +100 
units in the x, your initial x transformation parameter should be -100 
(moving the moving point set 100 units to the left).  For the majority 
of the other registration methods it would be intialized to +100 (moving 
the fixed point set 100 units to the right)).

It also doesn't have a problem with different sized point sets.

Cheers,
Dan



Wes Turner wrote:
> Rushin,
>
> I think you have it backward.  My belief is that the fixed points are 
> probed for points close to the moving points.  (From the 
> documentation: "A vector of minimum closest point distance is created 
> for each point in the moving point-set".)  This makes the registration 
> fragile to outliers in the moving data set.  Have you tried the 
> experiment in the other direction?  I.e. Add points to the fixed data 
> set and retry the registration.  If this is robust, then your 
> understanding is incorrect and you will need to adjust your data to 
> guard against outliers.
>
> The other  problem that could be occurring is that while the added 
> point is far from the correct position, the starting position of the 
> moving data puts the additional point close to the fixed data.  To 
> test this, start the moving data from the correct position ( i.e. 
> where the correct solution would be the identity matrix) and retry the 
> registration.
>
> - Wes
>
> On 10/11/07, *Zack Galbreath* < zack.galbreath at kitware.com 
> <mailto:zack.galbreath at kitware.com>> wrote:
>
>
>
>     Hi,
>
>     I am trying  to use ICP to register two datasets with different
>     number
>     of points. When the number of points in the two datasets is the
>     same it
>     works well and the returned transformation parameters are correct.
>     When
>     I add another point to the moving dataset (the added point is very
>     far
>     from the other points), the transformation parameters will change and
>     are not correct anymore. My understanding of ICP is that it should
>     find
>     the closest points to the fixed points and calculate the
>     transformation
>     parameters and apply it to the moving image and again find the closest
>     points in the transformed  moving dataset and find the transformation
>     parameters and iterate to find the final accumulated transformation
>     parameters. So it should be able to register two datasets with
>     different
>     number of points. Hence adding a point to the moving set (when it is
>     very far from the other points) should not change the result. My
>     question is that, in ITK, is ICP NOT able to register two datasets
>     with
>     different number of points or there is a problem in my program. I am
>     testing it with IterativeClosestPoint2.cxx and made a few changes to
>     make it 2D rather than 3D as followed:
>
>     #include "itkEuler2DTransform.h "         rather than        #include
>     "itkEuler3DTransform.h"
>     const unsigned int Dimension = 2;         rather than        const
>     unsigned int Dimension = 3;
>
>     typedef itk::Euler2DTransform< double > TransformType;         rather
>     than          typedef itk::Euler3DTransform< double > TransformType;
>
>     scales[0] = 1.0 / rotationScale;
>     scales[1] = 1.0 / translationScale;
>     scales[2] = 1.0 / translationScale;        rather than
>
>     scales[0] = 1.0 / rotationScale;
>     scales[1] = 1.0 / rotationScale;
>     scales[2] = 1.0 / rotationScale;
>     scales[3] = 1.0 / translationScale;
>     scales[4] = 1.0 / translationScale;
>     scales[5] = 1.0 / translationScale;
>
>     The rest of the code is exactly the same as the example in
>     IterativeClosestPoint2.cxx.
>     As a simple example, the inputs to the program are:
>     fixed dataset:
>     139 116
>     142 203
>     240 195
>
>     and moving dataset is:
>     251 85
>     254 172
>     352 164
>
>     In this case the transformation parameters are    rotation: 0
>     Translation: -112  31    which are correct
>     But when I add a point to the moving dataset for example (1, 1) or
>     any
>     other point which is very far from the existing ones, the result will
>     change, while it should not.
>     I appreciate if someone could help me.
>
>     Best,
>     Rushin
>
>
>
>
>
>
>
>     _______________________________________________
>     Insight-users mailing list
>     Insight-users at itk.org <mailto:Insight-users at itk.org>
>     http://www.itk.org/mailman/listinfo/insight-users
>
>
>
>
> -- 
> Wesley D. Turner, Ph.D.
> Kitware, Inc.
> R&D Engineer
> 28 Corporate Drive
> Clifton Park, NY 12065-8662
> Phone: 518-371-3971 x120
> ------------------------------------------------------------------------
>
> _______________________________________________
> Insight-users mailing list
> Insight-users at itk.org
> http://www.itk.org/mailman/listinfo/insight-users
>   



More information about the Insight-users mailing list