[Insight-users] Rigid + Scale transform
Vicente Grau
vicente at robots.ox.ac.uk
Tue Sep 20 14:04:59 EDT 2005
Luis, thanks very much for the information, and thanks to Daniel for the
useful extension. I have tried it and it works fine for me.
Now I have a question about the way the order of the rotation and
scaling in the ScaleSkewVersor3DTransform. The way the transformation
matrix is calculated in the code is:
const TScalarType vx = versor.GetX();
const TScalarType vy = versor.GetY();
const TScalarType vz = versor.GetZ();
const TScalarType vw = versor.GetW();
const TScalarType xx = vx * vx;
const TScalarType yy = vy * vy;
const TScalarType zz = vz * vz;
const TScalarType xy = vx * vy;
const TScalarType xz = vx * vz;
const TScalarType xw = vx * vw;
const TScalarType yz = vy * vz;
const TScalarType yw = vy * vw;
const TScalarType zw = vz * vw;
MatrixType newMatrix;
newMatrix[0][0] = m_Scale[0] - 2.0 * ( yy + zz );
newMatrix[1][1] = m_Scale[1] - 2.0 * ( xx + zz );
newMatrix[2][2] = m_Scale[2] - 2.0 * ( xx + yy );
newMatrix[0][1] = 2.0 * ( xy - zw );
newMatrix[0][2] = 2.0 * ( xz + yw );
newMatrix[1][0] = 2.0 * ( xy + zw );
newMatrix[1][2] = 2.0 * ( yz - xw );
newMatrix[2][0] = 2.0 * ( xz - yw );
newMatrix[2][1] = 2.0 * ( yz + xw );
where I have removed the skew part. I can see this is the expression for
transforming a quaternion into a rotation matrix, with the addition of
the scale parameters but I don't know how the composition of the two is
done here. Actually what I would like to know is if this is equivalent
to scaling + rotation, or rotation + scaling. But if you could point me
to a document where these expressions are explained in detail, it would
be really helpful. Thanks!
Vicente
Luis Ibanez wrote:
>
> Hi Vicente,
>
> Daniel Blezek modified the VersorRigidTransformOptimizer in order to
> make possible to use it for Transforms different from the VersorRigid3D
> Transform.
>
> As long as you arrange your extra transforms parameters to be at the
> end of the parameters array when you call GetParameters() and
> SetParameters(), then this optimizers should work for your purpose.
>
>
>
> Daniel: It took me a while to understand the reason why you extended
> this optimizer. My apologies for being slow.
>
>
>
> Regards,
>
>
> Luis
>
>
>
> ----------------------
> Vicente Grau wrote:
>
>> I am trying to do a 3D registration combining a rigid transform with
>> independent scaling in the three axes. The closest I've found in the
>> library is the itkScaleSkewVersor3DTransform, so my idea was to use
>> this as a base and remove the skew part, either by writing a new
>> transform class or by introducing a factor with SetScale() that
>> effectively eliminates this effect. I also thought about modifying
>> QuaternionRigidTransform to allow for non-unit quaternions. What do
>> you think is the best way to do this?
>> Furthermore, I guess I will need a special optimizer due to the
>> parameters forming a non-vector space. Is there an optimizer that
>> works with the ScaleSkewVersor3DTransform? Or, if not, how should I
>> modify the existing optimizers (VersorRigid3DTransformOptimizer, I
>> guess)?
>> Any help will be much appreciated!
>>
>> Vicente Grau
>> _______________________________________________
>> 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