[Insight-users] Help with ITK registration

somi seesomi at gmail.com
Thu Sep 10 19:06:30 EDT 2009


Hi,
I am trying to register two brain MR volumes. I plan to change the
optimizer/Metric/Transform and interpolator at different resolutions levels.
In particular I want to use the following combination at different
resolution levels:

 GDM=Gradient Difference metric : Edges contribute more than constant levels
 NMI=normalized Mutual Information
 EA= Evolutional algorithm
RSGD=RegularStepGradientDescentOptimizer

 Level -- Optimizer -- Metric -- Transform      -- Interpolator
 0      -- RSGD       -- GDM    -- Translation  -- NN
 1      -- RSGD       -- GDM    -- Versor3D    -- Linear
 2      -- RSGD       -- GDM    -- Affine          -- Linear
 3      -- RSGD       -- NMI      -- Affine          -- Linear
 4      -- EA            -- NMI      -- Demons      -- Windowed Sync

I plan to use Gradient Difference metric at coarse resolution levels because
it gives more weight to edges.

I have the following doubts in implementation:

a) I did go through the theory superficially, and found the above to be a
reasonable combination. If someone has more experience, could you suggest if
the optimizer/metric/interpolator combination is reasonable or is there a
better combination (I am registering Brain MR volumes) or it can only be
determined after experimentation on my dataset ?


b) This is more fundamental and implementation related. The general
structure of my program is :


// Code starts
class CommandIterationUpdate : public itk::Command { ...print iteration
updates here}

//command observer
class RegistrationInterfaceCommand : public itk::Command
{...change parameters of registration here, e.g step size etc.}

// main program
main{}

so for example if I have to change optimizer after a particular resolution
level, how do I change it in my RegistrationInterfaceCommand and how will my
CommandIterationUpdate change ? because in the commanditerationupdate, we
have

public:
  typedef   itk::RegularStepGradientDescentOptimizer     OptimizerType;
typedef   const OptimizerType   *           OptimizerPointer;

and then we get position/value etc from this pointer. If my optimizertype
changes when do I have to check what resolution level it is and user
appropriate pointer?

Also do we allocate memory and define all the optimizers/metric in the main
program or can we do it in the RegistrationInterfaceCommand when a
particular resolution is reached?


Regards,
Somi
-------------- next part --------------
An HTML attachment was scrubbed...
URL: <http://www.itk.org/pipermail/insight-users/attachments/20090910/5416bf1a/attachment-0001.htm>


More information about the Insight-users mailing list