# [Insight-users] Going from 4x4 matrix to Similarity3DTransform and back during registration

Jan Owoc jsowoc at gmail.com
Sat Jan 28 14:53:10 EST 2006

Thank you Luis,

I am getting answers, but something is not right. My code is as follows:

(...)
int i = 0;
int j = 0;
vnl_matrix<double> m(3,3);

cout << "Enter the 3x3 rotation/scale matrix, across first." << endl;
for (i = 0; i < 3; i++)
for (j = 0; j < 3; j++)
cin >> m[i][j];
vnl_svd<double> svd(m);
vnl_matrix<double> r(3,3);
r = svd.U() * vnl_transpose(svd.V());

typedef itk::Similarity3DTransform< double > TransformType;
typedef TransformType::VersorType VersorType;
VersorType myrot;
typedef VersorType::MatrixType MatrixType;
MatrixType mat;
for (i = 0; i < 3; i++)
for (j = 0; j < 3; j++)
mat[i][j] = r[i][j];
myrot.Set(mat);

cout << "Scale factor:\t" << myrot.GetScalar() << endl;
cout << "X versor:\t" << myrot.GetX() << endl;
cout << "Y versor:\t" << myrot.GetY() << endl;
cout << "Z versor:\t" << myrot.GetZ() << endl;
(...)

In a different program, I have:
(...)
typedef itk::Similarity3DTransform<double> TransformType;
TransformType::Pointer transform = TransformType::New();
(...) set parameters, perform registration (...)
const itk::Matrix<double,3,3> matrix3x3 = transform->GetMatrix();
cout << "  - 3x3 transform matrix:" << endl;
for (int i = 0; i < 3; i++) {
cout << "      ";
for (int j = 0; j < 3; j++) {
printf("%8.4f ",matrix3x3[i][j]);
}
cout << endl;
}
(...)

When I take the 3x3 transform matrix, and put in in the SVD program, I don't
get my original 3 versors and scale. What am I doing wrong?

Thank you for your help.

Jan Owoc

2006/1/24, Luis Ibanez <luis.ibanez at kitware.com>:
>
>
>
> Hi Jan,
>
>
> In order to convert your 4x4 transform in to an
> ITK Similarity transform you can do the following
>
>
> Your 4x4 matrix can be interpreted as:
>
>       R11  R12  R13  T1
>       R21  R22  R23  T2
>       R31  R32  R33  T3
>       Sh1  Sh2  Sh3  SC
>
>
> Where
>
>      T1,T2,T3       are Translations
>      SC             is a Scalinig factor
>      Sh1,Sh2,Sh3    are Shearing factors
>      R11... R33     are the rotations
>
>
> If your 4x4 matrix is formed correctly
> representing a Similarit transform, then
> the following constrains may be maintained
>
>
> 1) Sh1, Sh2, Sh3  MUST be null
> 2) The 3x3 submatrix R11..R22  MUST be orthogonal
>
>
>
> It that holds true, then you can use SVD in order
> to find the Versor that matches the 3x3 matrix.
>
> You will find and example on how to do this on
> the Registration example:
>
>       Insight/
>            Examples/
>                Registration/
>                    ImageRegistration9.cxx
>
>
> Then you can setup the ITK Similarity transform
> by using:
>
>
>        A) an ITK Versor for the rotation
>        B) an ITK Vector for the translation
>        C) a scalar value for the Scaling
>
>
>
> Please let us know if you have further questions.
>
>
>
>       Thanks
>
>
>         Luis
>
-------------- next part --------------
An HTML attachment was scrubbed...
URL: http://public.kitware.com/pipermail/insight-users/attachments/20060128/8d06cbff/attachment.htm