Hi,<br>I am trying to register two brain MR volumes. I plan to change the optimizer/Metric/Transform and interpolator at different resolutions levels.<br>In particular I want to use the following combination at different resolution levels:<br>
<br> GDM=Gradient Difference metric : Edges contribute more than constant levels<br> NMI=normalized Mutual Information<br> EA= Evolutional algorithm<br>RSGD=RegularStepGradientDescentOptimizer<br><br> Level -- Optimizer -- Metric -- Transform      -- Interpolator<br>
 0      -- RSGD       -- GDM    -- Translation  -- NN<br> 1      -- RSGD       -- GDM    -- Versor3D    -- Linear<br> 2      -- RSGD       -- GDM    -- Affine          -- Linear<br> 3      -- RSGD       -- NMI      -- Affine          -- Linear<br>
 4      -- EA            -- NMI      -- Demons      -- Windowed Sync<br><br>I plan to use Gradient Difference metric at coarse resolution levels because it gives more weight to edges.<br><br>I have the following doubts in implementation:<br>
<br>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 ?<br>
<br><br>b) This is more fundamental and implementation related. The general structure of my program is :<br><br><br>// Code starts<br>class CommandIterationUpdate : public itk::Command { ...print iteration updates here}<br>
<br>//command observer<br>class RegistrationInterfaceCommand : public itk::Command <br>{...change parameters of registration here, e.g step size etc.}<br><br>// main program<br>main{}<br><br>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<br>
<br>public:<br>  typedef   itk::RegularStepGradientDescentOptimizer     OptimizerType;<br>typedef   const OptimizerType   *           OptimizerPointer;<br><br>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?<br>
<br>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?<br><br><br>Regards,<br>Somi<br>