<div>Dear&nbsp;All,</div>
<div>&nbsp;</div>
<div>I tried to apply different optimizers for&nbsp;doing registration&nbsp;of the sample images in the BrainWeb.</div>
<div>I tried using both Powell and RegularStepGradientDescent Optimizer.</div>
<div>Both give me different results. The algorithm was modified from the sample programs; attached below.</div>
<div>Powell's result is as expected, though if I changed some parameters (i.e. step size, optimizer scales, multiresolution level&nbsp;) I also got different results. Even, if I tried to give initial transformation close to the answer, it ended up to give wrong result. 
</div>
<div>&nbsp;</div>
<div>My questions:</div>
<div>1. What's wrong with the code using the RegularStepGradientDescent Optimizer below ? Why couldn't it give the correct result ?</div>
<div>2. What's the significance of the parameters in the codes ?</div>
<div>3. Can I say that registration is dependant on the parameters that we specify ? So, it's like a guessing problem ? When would only can get result if we guess it correctly ?</div>
<div>&nbsp;</div>
<div>Could anybody answer me please.</div>
<div>Thank you in advance.</div>
<div>Regards.</div>
<div>&nbsp;</div>
<div>Dilla</div>
<div>&nbsp;</div>
<div>Codes:</div>
<div>&nbsp;</div>
<div>
<p>#if defined(_MSC_VER)<br>#pragma warning ( disable : 4786 )<br>#endif</p>
<p>#include &quot;itkMultiResolutionImageRegistrationMethod.h&quot;<br>#include &quot;itkMultiResolutionPyramidImageFilter.h&quot;<br>#include &quot;itkMattesMutualInformationImageToImageMetric.h&quot;<br>//#include &quot; 
itkLinearInterpolateImageFunction.h&quot;<br>#include &quot;itkBSplineInterpolateImageFunction.h&quot;<br>//#include &quot;itkPowellOptimizer.h&quot;<br>#include &quot;itkRegularStepGradientDescentOptimizer.h&quot;<br>#include &quot; 
itkNormalVariateGenerator.h&quot;</p>
<p>#include &quot;itkImage.h&quot;</p>
<p>#include &quot;itkTimeProbesCollectorBase.h&quot;</p>
<p>#include &quot;itkEuler3DTransform.h&quot;<br>#include &quot;itkCenteredTransformInitializer.h&quot;</p>
<p>#include &quot;itkImageFileReader.h&quot;<br>#include &quot;itkImageFileWriter.h&quot;</p>
<p>#include &quot;itkResampleImageFilter.h&quot;<br>#include &quot;itkSubtractImageFilter.h&quot;<br>#include &quot;itkRescaleIntensityImageFilter.h&quot;</p>
<p>#include &quot;itkCommand.h&quot;</p>
<p>class CommandIterationUpdate : public itk::Command <br>{<br>public:<br>&nbsp; typedef&nbsp; CommandIterationUpdate&nbsp;&nbsp; Self;<br>&nbsp; typedef&nbsp; itk::Command&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; Superclass;<br>&nbsp; typedef itk::SmartPointer&lt;Self&gt;&nbsp; Pointer;<br>
&nbsp; itkNewMacro( Self );<br>protected:<br>&nbsp; CommandIterationUpdate() {};<br>public:<br>&nbsp; typedef&nbsp;itk::RegularStepGradientDescentOptimizer&nbsp;OptimizerType;<br>&nbsp; typedef&nbsp;&nbsp; const OptimizerType&nbsp;&nbsp; *&nbsp;&nbsp;&nbsp; OptimizerPointer;</p>
<p>&nbsp; void Execute(itk::Object *caller, const itk::EventObject &amp; event)<br>&nbsp;&nbsp;&nbsp; {<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; Execute( (const itk::Object *)caller, event);<br>&nbsp;&nbsp;&nbsp; }</p>
<p>&nbsp; void Execute(const itk::Object * object, const itk::EventObject &amp; event)<br>&nbsp;&nbsp;&nbsp; {<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; OptimizerPointer optimizer = <br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; dynamic_cast&lt; OptimizerPointer &gt;( object );<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; if( ! itk::IterationEvent().CheckEvent( &amp;event ) ) 
<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; {<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; return;<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; }<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; std::cout &lt;&lt; optimizer-&gt;GetCurrentIteration() &lt;&lt; &quot;&nbsp;&nbsp; &quot;;<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; std::cout &lt;&lt; optimizer-&gt;GetValue() &lt;&lt; &quot;&nbsp;&nbsp; &quot;;<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; std::cout &lt;&lt; optimizer-&gt;GetCurrentPosition() &lt;&lt; std::endl; 
<br>&nbsp;&nbsp;&nbsp; }<br>};</p>
<p>template &lt;typename TRegistration&gt;<br>class RegistrationInterfaceCommand : public itk::Command <br>{<br>public:<br>&nbsp; typedef&nbsp; RegistrationInterfaceCommand&nbsp;&nbsp; Self;<br>&nbsp; typedef&nbsp; itk::Command&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; Superclass; 
<br>&nbsp; typedef&nbsp; itk::SmartPointer&lt;Self&gt;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; Pointer;<br>&nbsp; itkNewMacro( Self );<br>protected:<br>&nbsp; RegistrationInterfaceCommand() {};<br>public:<br>&nbsp; typedef&nbsp;&nbsp; TRegistration&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; RegistrationType; 
<br>&nbsp; typedef&nbsp;&nbsp; RegistrationType *&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; RegistrationPointer;<br>&nbsp; typedef&nbsp;&nbsp; itk::RegularStepGradientDescentOptimizer&nbsp;&nbsp; &nbsp;&nbsp;&nbsp;OptimizerType;<br>&nbsp; typedef&nbsp;&nbsp; OptimizerType *&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; OptimizerPointer; 
<br>&nbsp; void Execute(itk::Object * object, const itk::EventObject &amp; event)<br>&nbsp; {<br>&nbsp;&nbsp;&nbsp; if(itk::IterationEvent().CheckEvent( &amp;event ))<br>&nbsp;&nbsp;&nbsp; {</p>
<p>&nbsp;&nbsp;&nbsp;&nbsp; RegistrationPointer registration =<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; dynamic_cast&lt;RegistrationPointer&gt;( object );<br>&nbsp;&nbsp;&nbsp;&nbsp; OptimizerPointer optimizer = dynamic_cast&lt; OptimizerPointer &gt;( <br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; registration-&gt;GetOptimizer() ); 
</p>
<p>&nbsp;if ( registration-&gt;GetCurrentLevel() == 0 )<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; {<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; optimizer-&gt;SetMaximumStepLength( 0.1 );&nbsp; <br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; optimizer-&gt;SetMinimumStepLength( 0.001 );<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; }<br>&nbsp;&nbsp;&nbsp; else<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; {<br>&nbsp;&nbsp;double currentLevel = (double)registration-&gt;GetCurrentLevel(); 
<br>&nbsp;&nbsp;double totalLevel = (double)registration-&gt;GetNumberOfLevels();<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; optimizer-&gt;SetMaximumStepLength( 0.1 * currentLevel/totalLevel);<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; optimizer-&gt;SetMinimumStepLength( 0.001 * currentLevel/totalLevel); 
<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; }<br>&nbsp;std::cout &lt;&lt; &quot;Interation: &quot; &lt;&lt; registration-&gt;GetCurrentLevel() &lt;&lt; std::endl;<br>&nbsp;&nbsp;&nbsp; }<br>&nbsp; }<br>&nbsp; void Execute(const itk::Object * , const itk::EventObject &amp; )<br>&nbsp;&nbsp;&nbsp; { return; } 
<br>};</p>
<p>int main(&nbsp; )<br>{<br>/*&nbsp; if( argc &lt; 4 )<br>&nbsp;&nbsp;&nbsp; {<br>&nbsp;&nbsp;&nbsp; std::cerr &lt;&lt; &quot;Missing Parameters &quot; &lt;&lt; std::endl;<br>&nbsp;&nbsp;&nbsp; std::cerr &lt;&lt; &quot;Usage: &quot; &lt;&lt; argv[0];<br>&nbsp;&nbsp;&nbsp; std::cerr &lt;&lt; &quot; fixedImageFile&nbsp; movingImageFile &quot;; 
<br>&nbsp;&nbsp;&nbsp; std::cerr &lt;&lt; &quot; outputImagefile&nbsp; [differenceAfterRegistration] &quot;;<br>&nbsp;&nbsp;&nbsp; std::cerr &lt;&lt; &quot; [differenceBeforeRegistration] &quot;;<br>&nbsp;&nbsp;&nbsp; std::cerr &lt;&lt; &quot; [initialStepLength] &quot;&lt;&lt; std::endl; 
<br>&nbsp;&nbsp;&nbsp; return EXIT_FAILURE;<br>&nbsp;&nbsp;&nbsp; }<br>&nbsp;*/ <br>&nbsp; const&nbsp;&nbsp;&nbsp; unsigned int&nbsp;&nbsp;&nbsp; Dimension = 3;<br>&nbsp; typedef&nbsp; unsigned char&nbsp;&nbsp; PixelType;</p>
<p>&nbsp; typedef itk::Image&lt; PixelType, Dimension &gt;&nbsp; FixedImageType;<br>&nbsp; typedef itk::Image&lt; PixelType, Dimension &gt;&nbsp; MovingImageType;<br>&nbsp; typedef&nbsp;&nbsp; float&nbsp;&nbsp;&nbsp;&nbsp; InternalPixelType;<br>&nbsp; typedef itk::Image&lt; InternalPixelType, Dimension &gt; InternalImageType; 
</p>
<p>&nbsp; typedef itk::Euler3DTransform&lt; double &gt; TransformType;</p>
<p>&nbsp; typedef&nbsp;itk::RegularStepGradientDescentOptimizer&nbsp;OptimizerType;</p>
<p>&nbsp;typedef itk::MattesMutualInformationImageToImageMetric&lt; <br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; InternalImageType, <br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; InternalImageType &gt;&nbsp;&nbsp;&nbsp; MetricType;</p>
<p>&nbsp;typedef itk:: LinearInterpolateImageFunction&lt; <br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; InternalImageType,<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; double&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &gt;&nbsp;&nbsp;&nbsp; InterpolatorType;</p>
<p><br>/*&nbsp;&nbsp; typedef itk::BSplineInterpolateImageFunction&lt; <br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; InternalImageType, double &gt;&nbsp; InterpolatorType;<br>*/&nbsp; </p>
<p>&nbsp; typedef itk::MultiResolutionImageRegistrationMethod&lt; <br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; InternalImageType, <br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; InternalImageType &gt;&nbsp;&nbsp; RegistrationType; </p>
<p>&nbsp; typedef itk::MultiResolutionPyramidImageFilter&lt;<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; InternalImageType,<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; InternalImageType &gt;&nbsp;&nbsp; FixedImagePyramidType;<br>&nbsp; typedef itk::MultiResolutionPyramidImageFilter&lt; 
<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; InternalImageType,<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; InternalImageType &gt;&nbsp;&nbsp; MovingImagePyramidType;</p>
<p>&nbsp; MetricType::Pointer&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; metric&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; = MetricType::New();<br>&nbsp; OptimizerType::Pointer&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; optimizer&nbsp;&nbsp;&nbsp;&nbsp; = OptimizerType::New();<br>&nbsp; InterpolatorType::Pointer&nbsp;&nbsp; interpolator&nbsp; = InterpolatorType::New();<br>&nbsp; RegistrationType::Pointer&nbsp;&nbsp; registration&nbsp; = RegistrationType::New(); 
<br>&nbsp; <br>&nbsp; registration-&gt;SetMetric(&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; metric&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; );<br>&nbsp; registration-&gt;SetOptimizer(&nbsp;&nbsp;&nbsp;&nbsp; optimizer&nbsp;&nbsp;&nbsp;&nbsp; );<br>&nbsp; registration-&gt;SetInterpolator(&nbsp; interpolator&nbsp; );</p>
<p><br>&nbsp; TransformType::Pointer&nbsp; transform = TransformType::New();<br>&nbsp; registration-&gt;SetTransform( transform );</p>
<p>&nbsp; typedef itk::ImageFileReader&lt; FixedImageType&nbsp; &gt; FixedImageReaderType;<br>&nbsp; typedef itk::ImageFileReader&lt; MovingImageType &gt; MovingImageReaderType;</p>
<p>&nbsp; FixedImageReaderType::Pointer&nbsp; fixedImageReader&nbsp; = FixedImageReaderType::New();<br>&nbsp; MovingImageReaderType::Pointer movingImageReader = MovingImageReaderType::New();</p>
<p>&nbsp; fixedImageReader-&gt;SetFileName(&quot;brainweb1e1a10f20.mha&quot;);<br>&nbsp; movingImageReader-&gt;SetFileName( &quot;brainweb1e1a10f20Rot10Tx15.mha&quot; );</p>
<p>&nbsp; fixedImageReader-&gt;Update();<br>&nbsp; FixedImageType::SizeType size;<br>&nbsp; size = fixedImageReader-&gt;GetOutput()-&gt;GetLargestPossibleRegion().GetSize();</p>
<p>&nbsp; unsigned int numberOfBins = 30;<br>&nbsp; double percentOfSamples = 0.2;<br>&nbsp; unsigned int numberOfSamples = (unsigned int)(percentOfSamples*size[0]*size[1]*size[2]);<br>&nbsp; metric-&gt;SetNumberOfSpatialSamples(numberOfSamples); 
<br>&nbsp; metric-&gt;SetNumberOfHistogramBins(numberOfBins);</p>
<p>&nbsp; typedef itk::CastImageFilter&lt; <br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; FixedImageType, InternalImageType &gt; FixedCastFilterType;<br>&nbsp; typedef itk::CastImageFilter&lt; <br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; MovingImageType, InternalImageType &gt; MovingCastFilterType; 
</p>
<p>&nbsp; FixedCastFilterType::Pointer fixedCaster&nbsp;&nbsp; = FixedCastFilterType::New();<br>&nbsp; MovingCastFilterType::Pointer movingCaster = MovingCastFilterType::New();</p>
<p>&nbsp; fixedCaster-&gt;SetInput(fixedImageReader-&gt;GetOutput());<br>&nbsp; movingCaster-&gt;SetInput(movingImageReader-&gt;GetOutput());<br>&nbsp;<br>&nbsp; FixedImagePyramidType::Pointer fixedImagePyramid = <br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; FixedImagePyramidType::New(); 
<br>&nbsp; MovingImagePyramidType::Pointer movingImagePyramid =<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; MovingImagePyramidType::New();<br>&nbsp; registration-&gt;SetFixedImagePyramid(fixedImagePyramid);<br>&nbsp; registration-&gt;SetMovingImagePyramid(movingImagePyramid); 
</p>
<p>&nbsp; registration-&gt;SetFixedImage(&nbsp;&nbsp;&nbsp; fixedCaster-&gt;GetOutput()&nbsp;&nbsp;&nbsp; );<br>&nbsp; registration-&gt;SetMovingImage(&nbsp;&nbsp; movingCaster-&gt;GetOutput()&nbsp;&nbsp; );</p>
<p>////////////////////////////////////////////</p>
<p>&nbsp; InternalImageType::IndexType regStart;<br>&nbsp; regStart[0] = 0;<br>&nbsp; regStart[1] = 0;<br>&nbsp; regStart[2] = 0;</p>
<p>&nbsp; InternalImageType::SizeType regSize;<br>&nbsp; regSize[0] = size[0];<br>&nbsp; regSize[1] = size[1];<br>&nbsp; regSize[2] = size[2];</p>
<p>&nbsp; InternalImageType::RegionType region;<br>&nbsp; region.SetIndex(regStart);<br>&nbsp; region.SetSize(regSize);</p>
<p>&nbsp; registration-&gt;SetFixedImageRegion(region);</p>
<p>/////////////////////////////////////////////</p>
<p>&nbsp; fixedImageReader-&gt;Update();</p>
<p>&nbsp; movingImageReader-&gt;Update();</p>
<p><br>&nbsp; typedef FixedImageType::SpacingType&nbsp;&nbsp;&nbsp; SpacingType;<br>&nbsp; typedef FixedImageType::PointType&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; OriginType;<br>&nbsp; typedef FixedImageType::RegionType&nbsp;&nbsp;&nbsp;&nbsp; RegionType;<br>&nbsp; typedef FixedImageType::SizeType&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; SizeType; 
</p>
<p>&nbsp; FixedImageType::Pointer fixedImage = fixedImageReader-&gt;GetOutput();</p>
<p>&nbsp; const SpacingType fixedSpacing = fixedImage-&gt;GetSpacing();<br>&nbsp; OriginType&nbsp; fixedOrigin&nbsp; = fixedImage-&gt;GetOrigin();<br>&nbsp; const RegionType&nbsp; fixedRegion&nbsp; = fixedImage-&gt;GetLargestPossibleRegion(); <br>&nbsp; const SizeType&nbsp;&nbsp;&nbsp; fixedSize&nbsp;&nbsp;&nbsp; = 
fixedRegion.GetSize();<br>&nbsp; </p>
<p>&nbsp; TransformType::InputPointType centerFixed;<br>&nbsp; <br>&nbsp; centerFixed[0] = regStart[0] + fixedSpacing[0] * regSize[0] / 2.0 ;<br>&nbsp; centerFixed[1] = regStart[1] + fixedSpacing[1] * regSize[1] / 2.0 ;<br>&nbsp; centerFixed[2] = regStart[2] + fixedSpacing[2] * regSize[2] / 
2.0 ;<br>&nbsp; // moving image<br>&nbsp; MovingImageType::Pointer movingImage = movingImageReader-&gt;GetOutput();</p>
<p>&nbsp; const SpacingType movingSpacing = movingImage-&gt;GetSpacing();<br>&nbsp; const OriginType&nbsp; movingOrigin&nbsp; = movingImage-&gt;GetOrigin();<br>&nbsp; const RegionType&nbsp; movingRegion&nbsp; = movingImage-&gt;GetLargestPossibleRegion();<br>
&nbsp; const SizeType&nbsp;&nbsp;&nbsp; movingSize&nbsp;&nbsp;&nbsp; = movingRegion.GetSize();<br>&nbsp; <br>&nbsp; TransformType::InputPointType centerMoving;<br>&nbsp; <br>&nbsp; centerMoving[0] = movingOrigin[0] + movingSpacing[0] * movingSize[0] / 2.0;<br>&nbsp; centerMoving[1] = movingOrigin[1] + movingSpacing[1] * movingSize[1] / 
2.0;<br>&nbsp; centerMoving[2] = movingOrigin[2] + movingSpacing[2] * movingSize[2] / 2.0;</p>
<p>&nbsp; transform-&gt;SetCenter( centerFixed );<br>&nbsp; transform-&gt;SetTranslation( centerMoving - centerFixed );</p>
<p>&nbsp;// transform-&gt;SetIdentity(&nbsp; );<br>&nbsp;<br>&nbsp; registration-&gt;SetInitialTransformParameters( transform-&gt;GetParameters() );</p>
<p>&nbsp; typedef OptimizerType::ScalesType&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; OptimizerScalesType;<br>&nbsp; OptimizerScalesType optimizerScales( transform-&gt;GetNumberOfParameters() );<br>&nbsp; const double translationScale = 1.0;</p>
<p>&nbsp; optimizerScales[0] = 1.0;//rotation<br>&nbsp; optimizerScales[1] = 1.0;//rotation<br>&nbsp; optimizerScales[2] = 1.0;//rotation<br>&nbsp; optimizerScales[3] = translationScale;<br>&nbsp; optimizerScales[4] = translationScale;<br>&nbsp; optimizerScales[5] = translationScale; 
</p>
<p>&nbsp; optimizer-&gt;SetScales( optimizerScales );</p>
<p>/*&nbsp; double initialStepLength = 5;</p>
<p><br>&nbsp; // Power's Optimizer<br>&nbsp; optimizer-&gt;SetMaximumIteration(200);<br>&nbsp; optimizer-&gt;SetStepLength(2.0);<br>&nbsp; optimizer-&gt;SetStepTolerance(0.01);<br>//&nbsp; optimizer-&gt;SetMaximize(false);<br>*/<br>&nbsp; // Create the Command observer and register it with the optimizer. 
<br>&nbsp; //<br>&nbsp;optimizer-&gt;SetNumberOfIterations( 200 );<br>//optimizer-&gt;SetMaximumStepLength( 10.00 );&nbsp; <br>//&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; optimizer-&gt;SetMinimumStepLength( 2 );<br>&nbsp; CommandIterationUpdate::Pointer observer = CommandIterationUpdate::New(); 
<br>&nbsp; optimizer-&gt;AddObserver( itk::IterationEvent(), observer );<br>&nbsp; // Create the command observer for registration<br>&nbsp; //<br>&nbsp; typedef RegistrationInterfaceCommand&lt;RegistrationType&gt; CommandType;<br>&nbsp; CommandType::Pointer command = CommandType::New(); 
<br>&nbsp; registration-&gt;AddObserver( itk::IterationEvent(), command );</p>
<p>&nbsp;// if ( argc &gt; 6 ) {<br>//&nbsp;registration-&gt;SetNumberOfLevels(std::atoi(argv[6]));<br>&nbsp;// } else {<br>&nbsp; &nbsp;registration-&gt;SetNumberOfLevels( 5 );<br>&nbsp;// }<br>&nbsp;<br>&nbsp; itk::TimeProbesCollectorBase timer;<br>&nbsp; try <br>
&nbsp;&nbsp;&nbsp; { <br>&nbsp;timer.Start(&quot;registration&quot;);<br>&nbsp;&nbsp;&nbsp; registration-&gt;StartRegistration(); <br>&nbsp;timer.Stop(&quot;registration&quot;);<br>&nbsp;&nbsp;&nbsp; } <br>&nbsp; catch( itk::ExceptionObject &amp; err ) <br>&nbsp;&nbsp;&nbsp; { <br>&nbsp;&nbsp;&nbsp; std::cerr &lt;&lt; &quot;ExceptionObject caught !&quot; &lt;&lt; std::endl; 
<br>&nbsp;&nbsp;&nbsp; std::cerr &lt;&lt; err &lt;&lt; std::endl; <br>&nbsp;&nbsp;&nbsp; return EXIT_FAILURE;<br>&nbsp;&nbsp;&nbsp; } <br>&nbsp; <br>&nbsp; timer.Report();</p>
<p>&nbsp; OptimizerType::ParametersType finalParameters = <br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; registration-&gt;GetLastTransformParameters();</p>
<p>&nbsp; const double finalAngleX&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; = finalParameters[0];<br>&nbsp; const double finalAngleY&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; = finalParameters[1];<br>&nbsp; const double finalAngleZ&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; = finalParameters[2];<br>&nbsp; const double finalTranslationX&nbsp;&nbsp;&nbsp;&nbsp; = finalParameters[3]; 
<br>&nbsp; const double finalTranslationY&nbsp;&nbsp;&nbsp;&nbsp; = finalParameters[4];<br>&nbsp; const double finalTranslationZ&nbsp;&nbsp;&nbsp;&nbsp; = finalParameters[5];</p>
<p>&nbsp; const unsigned int numberOfIterations = optimizer-&gt;GetCurrentIteration();</p>
<p>&nbsp; const double bestValue = optimizer-&gt;GetValue();</p>
<p><br>&nbsp; // Print out results<br>&nbsp; //<br>&nbsp; const double finalAngleXInDegrees = finalAngleX * 45.0 / atan(1.0);<br>&nbsp; const double finalAngleYInDegrees = finalAngleY * 45.0 / atan(1.0);<br>&nbsp; const double finalAngleZInDegrees = finalAngleZ * 
45.0 / atan(1.0);</p>
<p>&nbsp; std::cout &lt;&lt; &quot;Result = &quot; &lt;&lt; std::endl;</p>
<p>&nbsp; std::cout &lt;&lt; &quot; Angle X (degrees)&nbsp;&nbsp; = &quot; &lt;&lt; finalAngleXInDegrees&nbsp; &lt;&lt; std::endl;<br>&nbsp; std::cout &lt;&lt; &quot; Angle Y (degrees)&nbsp;&nbsp; = &quot; &lt;&lt; finalAngleYInDegrees&nbsp; &lt;&lt; std::endl; 
<br>&nbsp; std::cout &lt;&lt; &quot; Angle Z (degrees)&nbsp;&nbsp; = &quot; &lt;&lt; finalAngleZInDegrees&nbsp; &lt;&lt; std::endl;<br>&nbsp; std::cout &lt;&lt; &quot; Translation X = &quot; &lt;&lt; finalTranslationX&nbsp; &lt;&lt; std::endl;<br>&nbsp; std::cout &lt;&lt; &quot; Translation Y = &quot; &lt;&lt; finalTranslationY&nbsp; &lt;&lt; std::endl; 
<br>&nbsp; std::cout &lt;&lt; &quot; Translation Z = &quot; &lt;&lt; finalTranslationZ&nbsp; &lt;&lt; std::endl;<br>&nbsp; std::cout &lt;&lt; &quot; Iterations&nbsp;&nbsp;&nbsp; = &quot; &lt;&lt; numberOfIterations &lt;&lt; std::endl;<br>&nbsp; std::cout &lt;&lt; &quot; Metric value&nbsp; = &quot; &lt;&lt; bestValue&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &lt;&lt; std::endl; 
</p>
<p>&nbsp; return EXIT_SUCCESS;<br>}</p></div>