Similarity3DTransform like transform with 3 independent scales

A recent publication comparing registration methods (https://doi.org/10.1016/j.neuroimage.2018.03.025) come up with the MINC based bestlinreg from CIVET2.1 as being the most robust and reliable. There are obviously many differences in implementation comparing the ITK registration methods (as implemented in ANTs for example) and bestlinreg/minctracc, but a big omission in ITK is the “lsq9” transform, that is, a transform with 3 rotations, 3 translations and 3 scales.

Based on my reading of antsRegistration, I could probably fake a lsq9 transform by using the restrict-deformation feature on an Affine transform, but I’d like to propose the addition of a new transform type of lsq9 type.

Would this be an acceptable addition? I’m thinking I can either adapt the existing Similarity3DTransform or perhaps the AffineTransform.

1 Like

Doesn’t ScaleVersor3DTransform already do that? You can find all transforms in ITK on this list.

Nope.

ScaleVersor3DTransform is one of the ITK gotcha’s, you think it is transformation composition based on the name but the documentation says otherwise (the rotation and scale matrices are added, not multiplied).

Looks like all the Versor transforms have this property of composition by addition, so I think its a very different beast than the base affine type.

The ITK affine transforms all use analytic derivatives from computing the different Jacobins. I recall looking into having the ScaleVersor3DTransfrom be multiplied instead of added, and the derivative were not pretty as I recalled. It also was not clear to me if it actually would make a difference.

I suppose one could implement a scale Euler 3D with the derivative computed from finite differences, but that would be different than the existing affine transforms.

Thanks @blowekamp I’m not particularly interested in the Versor transforms, I’ll look into whether I can generalize the Similarity transform to do 3 independent scales.

1 Like

The Similarity3DTransform’s parent is VersorRigid3DTransform.html.

You’ll want to look atEuler3DTransform, but that is only rigid, so not scales.

I just wanted to follow up. I have been working on the CompositeTransform class. It is theoretically possible to create a composite transform with a Euler3D and a Scale transform and enable both transforms to be optimized. The CompositeTransfrom::ComputeJacobianWithRespectToParameters should properly compute the required derivatives! That is some serious smarts that have been put into the ITKv4 registration framework with composite transforms :thinking:

Oh wow, that’s pretty amazing. So, rather than banging my head against the wall on implementing a new transform, I’ll see if I can grok the ANTs/ITK registration code enough to add this composite transform type into the registration framework!