ENH: Add versorTransformOptimizerv4 class to ITKv4
authorAli Ghayoor <ali-ghayoor@uiowa.edu>
Thu, 6 Feb 2014 20:57:01 +0000 (14:57 -0600)
committerAli Ghayoor <ali-ghayoor@uiowa.edu>
Sat, 22 Feb 2014 01:37:35 +0000 (19:37 -0600)
commit80857f9cc330b900f684b2d5a9ecc36a68cdee90
treecc6545ef68e699fc0aaf7d643afa089af251772e
parent04cd842b3b6c83d75c102013f57e36c89f7cc37c
ENH: Add versorTransformOptimizerv4 class to ITKv4

ITKv3 has specific optimizer classes for optimization of the versor
transforms.

itkVersorRigid3DTransformOptimizer --> for optimization of versorRigid
transform.

itkVersorTransformOptimizer --> for optimization of scaleVersor and
                                    scaleSkewVersor transforms.
The above optimizers are variants of the gradient descent optimizer
implmented in RegularStepGradientDescentOptimizer.

This patch adds the versor optimization capability to ITKv4.

The "AdvancedOneStep" function in gradientDescentOptimizerv4 class
is implemented differently than the ITKv3. Now, in ITKv4, the transform
update process is delegated to the metric at each iteration.

The metric, also, makes the moving transform update its parameters via
"UpdateTransformParameters" function that is a virtual function defined
in the "itk::Transform" class. Derived classes can override this
function
if needed, as it is done here by the itkVersorRigid3DTransform.

The "UpdateTransformParameters" function gets two parameters, the
gradient and a multiplication factor that is set to 1 as default.

In ITKv4 implementation, the gradient variable is modified by scales and
learning rate in a multi threaded procedure before it is passed to the
"UpdateTransformParameters" function.

However, in versor optimization, the learning rate should be used in
computations after the gradient is normalized.

Since the modification by learning rate is a multi threaded processing,
I preferred to keep the gradientDescentOptimizerv4 class unchanged, and
define a new derived optimizer class for the versor transforms optimization
that overrides the "AdvancedOneStep" function. In the overridden
implementation, the learning rate is passed to the "UpdateTransformParameters"
function as a factor, and the versor transform will apply the learning rate
to the normalized gradient.

Since the "itkScaleVersor3DTransform" and "itkScaleSkewVersor3DTransform"
classes are derived from the "VersorRigid3DTransform", the above
implementation works for them as well.

To test the new changes, the ImageRegistration8Test is converted to
ITKv4 framework. This test generates acceptable results compared to its
v3 version.

Change-Id: I37e6f43f1967b917fcb2139c5505daf65b7fb28d
Examples/Registration/ImageRegistration8.cxx
Examples/Registration/test/CMakeLists.txt
Modules/Core/Transform/include/itkVersorRigid3DTransform.h
Modules/Core/Transform/include/itkVersorRigid3DTransform.hxx
Modules/Numerics/Optimizersv4/include/itkVersorTransformOptimizerv4.h [new file with mode: 0644]
Modules/Numerics/Optimizersv4/include/itkVersorTransformOptimizerv4.hxx [new file with mode: 0644]
Testing/Data/Baseline/Registration/ImageRegistration8RegisteredSlice.png.md5 [deleted file]
Testing/Data/Baseline/Registration/ImageRegistration8v4RegisteredSlice.png.md5 [new file with mode: 0644]