[ITK-users] Inverse of Versor Rigid Transform and RIRE

Matt McCormick matt.mccormick at kitware.com
Tue Apr 7 15:03:10 EDT 2015


Hi Gabriel!

> I am use RIRE project, specifically  CT (movig) and MR_PD (fixed) images.
> Basically, I hava a set of point (in millimeters) of the CT image to which
> apply the trasform result of the registration and updaload this results in
> the web for the evaluation. Example of set of points and his "ground truth"
> :
>
> Point      x          y          z        new_x       new_y       new_z
>
>   1       0.0000     0.0000     0.0000   -7.5731    -41.2534    -27.3093
>   2     333.9870     0.0000     0.0000  324.8722    -72.8159    -32.9063
>   3       0.0000   333.9870     0.0000   24.1607    291.0393    -16.2727
>   4     333.9870   333.9870     0.0000  356.6060    259.4768    -21.8697
>   5       0.0000     0.0000   112.0000   -6.0554    -45.1157     84.6137
>   6     333.9870     0.0000   112.0000  326.3899    -76.6782     79.0168
>   7       0.0000   333.9870   112.0000   25.6784    287.1769     95.6503
>   8     333.9870   333.9870   112.0000  358.1237    255.6145     90.0534

Trying to reproduce previous results is a good path forward.

> So, the first I need is the transformation to apply, for that I do the
> following :
>
>    //get the inverse transform
>    TransformType::Pointer inverseTransform = TransformType::New();
>    inverseTransform->SetCenter( finalTransform->GetCenter() );
>    bool response = finalTransform->GetInverse(inverseTransform);
>
>
> It makes sense to use the same center in the inverse transform?. A
> "quaternion" define an "axis" (right part) of rotation and an angle to use
> for rotate the image about this axis...why use a center of rotation...?

If you are working with a current version of ITK, when you get the
inverse transform, it should transfer the Center for you. The Center
point locations are the FixedParameters for the parent class,
MatrixOffsetTransformBase. The relationship with parent classes can be
found by examining the Doxygen page for the class [1].


> Second, apply this transform...as follows:
>
> NewPoint = RotationMatrix * OriginalPoint + Offset
>
> The rotation matrix and the offset are obtained from the inverse transforme
> objetc. Found something wrong? something that is not taking into account ?
> The results do not appear to be correct...the calculated error is too big
> and does not correspond with the visual result.

Do you get the same result by applying the TransformPoint() method of
the inverse transform? This is the API call that should be applied to
transform a point.

Thanks,
Matt


[1] http://www.itk.org/Doxygen/html/classitk_1_1VersorRigid3DTransform.html


More information about the Insight-users mailing list