[Insight-users] Versor3D Registration
Luis Ibanez
luis.ibanez at kitware.com
Sun Sep 24 11:19:08 EDT 2006
Hi Jaety,
You have interpreted the code correctly.
The parameter scaling only regulates how the "Step Length" is
*distributed* among all the parameters in the Transform.
That means that you *must* also choose the step length appropriately.
In practice one easy way to do this is to set the scaling parameters
of the rotations to 1.0, and then, when thinking about the StepLength
of the optimizer you think of it in terms of "radians".
For example,
A "small step" will be a value of 0.001,
that is about half a degree.
That means that this should be the initial StepLength that you pass to
the Optimizer.
Then, you set the parameter scaling of the *translations* in such a way
that the same 0.001 "small step" will map to a "small translation" in
the scale of your image.
For example, if you want to define a "small translation" as 1/10 of a
pixel, then you set your translation scaling to be:
0.001 / ( pixelspacing / 10.0 )
Regards,
Luis
------------------------
Jaety Edwards wrote:
> Hello All,
> I am working with a registration process that uses the
> VersorRigitd3DTransform, and the corresponding
> VersorRigid3DTransformOptimizer. I think I am a little confused about
> the way to scale the rotation vs. translation parameters and I'm
> hoping the list can help. Summing up my question: I'd like to make
> sure that the optimizer only takes relatively small steps (a few
> degrees) along the rotational parameters, while taking similarly small
> steps (a few units) on the translation axes. I'm having trouble
> figuring out how to make it do this correctly.
>
> As the help document explains, the rotation and scaling parameters
> have very differently scaled domains, and it goes on to explain that
> we can fix this by setting the scaling of the parameters. So, for
> instance, say I want to set up a registration where initially the
> biggest rotation step I can take is about 1 degree, and the biggest
> scaling translation is 1 unit. I thought that to do this I could set
> the initial step size to 1, set the translation scalings to 1, and set
> the rotation scalings to 360/(2*pi), but that still took huge steps
> along the rotation.
>
> So next I looked into the optimizer step update code
> (itkVersorRigid3DTransformOptimizer.cxx). Summing up what I found
> there, the update for the rotation goes like
>
> transformed_gradient = gradient / scaling;
> axis = (first 3 entries of transformed_gradient)
>
> and finally, the rotation about the axis is set as
> step_length * ||axis|| / ||transformed_gradient||
>
> Thinking about this though, it means that if the gradient (for
> instance) points purely along one parameter axis, the update step
> along that axis will be the step length, regardless of the scaling of
> that axis. If that's right, I can't see how to set a step length that
> is meaningful both for the rotations and the translations. I'm sure I
> must be missing something though, so I'm hoping someone can help me
> clear up my confusion.
>
> Thanks a lot,
> Jaety
> _______________________________________________
> 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