<DIV>Hello,</DIV>
<DIV>The program below is based on registration example and allow an centeredAffineTransform with a iMattesMutualInformation metric...</DIV>
<DIV>I test it with BrainT1SliceBorder20.png and BrainProtonDensitySliceR10X13Y17S12.png. The result is not so bad, but not really good ...</DIV>
<DIV>I think the convergence is to fast ... I think I had to change some parameters but I don't where ....</DIV>
<DIV>Thanks for help</DIV>
<DIV>lagaffe</DIV>
<DIV>-----------------------------------</DIV>
<DIV>Initial Transform Parameters<BR>[1, 0, 0, 1, 110.771, 131.272, -12.3588, -12.3721]<BR>0&nbsp;&nbsp; -0.494313&nbsp;&nbsp; [1.03129, 0.0592011, 0.0384303, 1.04259, 110.771, 131.272, -12.3226, -12.3418]<BR>1&nbsp;&nbsp; -0.506525&nbsp;&nbsp; [1.01369, 0.0180759, 0.0374976, 1.04872, 110.772, 131.273, -12.3427, -12.3341]<BR>2&nbsp;&nbsp; -0.497655&nbsp;&nbsp; [1.01052, 0.00387624, 0.0555589, 1.08858, 110.771, 131.272, -12.3573, -12.3215]<BR>3&nbsp;&nbsp; -0.476204&nbsp;&nbsp; [0.985719, -0.0221933, 0.0718157, 1.08991, 110.771, 131.271, -12.3836, -12.3058]<BR>4&nbsp;&nbsp; -0.46122&nbsp;&nbsp; [0.952404, -0.0489021, 0.0696406, 1.07258, 110.77, 131.27, -12.4026, -12.3026]<BR>5&nbsp;&nbsp; -0.46892&nbsp;&nbsp; [0.951745, -0.0356225, 0.0613028, 1.05532, 110.771, 131.271, -12.3971, -12.3096]<BR>6&nbsp;&nbsp; -0.476501&nbsp;&nbsp; [0.942724, -0.0359882, 0.0670168, 1.05927, 110.771, 131.271, -12.4003, -12.3057]<BR>7&nbsp;&nbsp; -0.476813&nbsp;&nbsp; [0.934107, -0.0352334, 0.0731064,
 1.05942, 110.77, 131.27, -12.4026, -12.2995]<BR>8&nbsp;&nbsp; -0.481887&nbsp;&nbsp; [0.9309, -0.0309813, 0.0819638, 1.0591, 110.77, 131.27, -12.4014, -12.2926]<BR>9&nbsp;&nbsp; -0.485281&nbsp;&nbsp; [0.927642, -0.0303667, 0.088813, 1.06742, 110.769, 131.269, -12.4017, -12.2872]<BR>10&nbsp;&nbsp; -0.483528&nbsp;&nbsp; [0.923046, -0.0309841, 0.0869023, 1.06398, 110.769, 131.27, -12.4023, -12.2885]<BR>11&nbsp;&nbsp; -0.486905&nbsp;&nbsp; [0.922546, -0.0292402, 0.0886269, 1.06479, 110.769, 131.269, -12.4015, -12.287]<BR>12&nbsp;&nbsp; -0.486916&nbsp;&nbsp; [0.920049, -0.0300743, 0.0896122, 1.06465, 110.769, 131.269, -12.4027, -12.2863]<BR>13&nbsp;&nbsp; -0.489127&nbsp;&nbsp; [0.917638, -0.0309204, 0.0903297, 1.06447, 110.769, 131.269, -12.4037, -12.2851]<BR>14&nbsp;&nbsp; -0.490183&nbsp;&nbsp; [0.918016, -0.0299934, 0.0909949, 1.06494, 110.769, 131.269, -12.4031, -12.2844]<BR>15&nbsp;&nbsp; -0.489932&nbsp;&nbsp; [0.918292, -0.0290254, 0.0916975, 1.06503, 110.769, 131.269, -12.4024,
 -12.2837]<BR>Result =<BR>&nbsp;Center X&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; = 110.769<BR>&nbsp;Center Y&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; = 131.269<BR>&nbsp;Translation X = -12.4024<BR>&nbsp;Translation Y = -12.2837<BR>&nbsp;Iterations&nbsp;&nbsp;&nbsp; = 17<BR>&nbsp;Metric value&nbsp; = -0.490452</DIV>
<DIV>&nbsp;</DIV>
<DIV>-----------------------</DIV>
<DIV>source code if someone want it:</DIV>
<DIV>&nbsp;</DIV>
<DIV>&nbsp;</DIV>
<DIV><BR>#include "itkImageRegistrationMethod.h"<BR>//#include "itkMeanSquaresImageToImageMetric.h"<BR>#include "itkMattesMutualInformationImageToImageMetric.h"<BR>#include "itkLinearInterpolateImageFunction.h"<BR>#include "itkRegularStepGradientDescentOptimizer.h"<BR>#include "itkImage.h"</DIV>
<DIV><BR>#include "itkCenteredTransformInitializer.h"<BR>#include "itkCenteredAffineTransform.h"<BR>#include "itkImageFileReader.h"<BR>#include "itkImageFileWriter.h"</DIV>
<DIV>#include "itkResampleImageFilter.h"<BR>#include "itkCastImageFilter.h"<BR>#include "itkSquaredDifferenceImageFilter.h"<BR>#include "itkCommand.h"<BR>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 itk::RegularStepGradientDescentOptimizer&nbsp;&nbsp;&nbsp;&nbsp; OptimizerType;<BR>&nbsp; typedef&nbsp;&nbsp; const OptimizerType&nbsp;&nbsp; *&nbsp;&nbsp;&nbsp; OptimizerPointer;</DIV>
<DIV>&nbsp; void Execute(itk::Object *caller, const itk::EventObject &amp; event)<BR>&nbsp; {<BR>&nbsp;&nbsp;&nbsp; Execute( (const itk::Object *)caller, event);<BR>&nbsp; }</DIV>
<DIV>&nbsp; void Execute(const itk::Object * object, const itk::EventObject &amp; event)<BR>&nbsp; {<BR>&nbsp;&nbsp;&nbsp; OptimizerPointer optimizer = <BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; dynamic_cast&lt; OptimizerPointer &gt;( object );<BR>&nbsp;&nbsp;&nbsp; if( typeid( event ) != typeid( itk::IterationEvent ) )<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; {<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; return;<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; }<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; std::cout &lt;&lt; optimizer-&gt;GetCurrentIteration() &lt;&lt; "&nbsp;&nbsp; ";<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; std::cout &lt;&lt; optimizer-&gt;GetValue() &lt;&lt; "&nbsp;&nbsp; ";<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; std::cout &lt;&lt; optimizer-&gt;GetCurrentPosition() &lt;&lt; std::endl;<BR>&nbsp; }<BR>};</DIV>
<DIV><BR>int main( int argc, char *argv[] )<BR>{<BR>&nbsp; if( argc &lt; 4 )<BR>&nbsp;&nbsp;&nbsp; {<BR>&nbsp;&nbsp;&nbsp; std::cerr &lt;&lt; "Missing Parameters " &lt;&lt; std::endl;<BR>&nbsp;&nbsp;&nbsp; std::cerr &lt;&lt; "Usage: " &lt;&lt; argv[0];<BR>&nbsp;&nbsp;&nbsp; std::cerr &lt;&lt; "&nbsp;&nbsp; fixedImageFile&nbsp; movingImageFile " &lt;&lt; std::endl;<BR>&nbsp;&nbsp;&nbsp; std::cerr &lt;&lt; "&nbsp;&nbsp; outputImagefile&nbsp; [differenceOutputfile] [differenceBeforeRegistration] " &lt;&lt; std::endl;<BR>&nbsp;&nbsp;&nbsp; std::cerr &lt;&lt; "&nbsp;&nbsp; [stepLength] [maxNumberOfIterations] "&lt;&lt; std::endl;<BR>&nbsp;&nbsp;&nbsp; return 1;<BR>&nbsp;&nbsp;&nbsp; }</DIV>
<DIV>&nbsp; const&nbsp;&nbsp;&nbsp; unsigned int&nbsp;&nbsp;&nbsp; Dimension = 2;<BR>&nbsp; typedef&nbsp; float&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; PixelType;</DIV>
<DIV>&nbsp; typedef itk::Image&lt; PixelType, Dimension &gt;&nbsp; FixedImageType;<BR>&nbsp; typedef itk::Image&lt; PixelType, Dimension &gt;&nbsp; MovingImageType;<BR>&nbsp; <BR>&nbsp; typedef itk::CenteredAffineTransform&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; double, <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; Dimension&nbsp; &gt;&nbsp;&nbsp;&nbsp;&nbsp; TransformType;<BR>&nbsp; typedef itk::RegularStepGradientDescentOptimizer&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; OptimizerType;<BR>&nbsp; /*<BR>&nbsp; typedef itk::MeanSquaresImageToImageMetric&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; FixedImageType, <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; MovingImageType &gt;&nbsp;&nbsp;&nbsp; MetricType;<BR>&nbsp; */<BR>&nbsp;&nbsp; <BR>&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;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; FixedImageType,
 <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;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; MovingImageType &gt;&nbsp;&nbsp;&nbsp; MetricType;<BR>&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; MovingImageType,<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;<BR>&nbsp; typedef itk::ImageRegistrationMethod&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; FixedImageType, <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; MovingImageType &gt;&nbsp;&nbsp;&nbsp; RegistrationType;</DIV>
<DIV>&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();</DIV>
<DIV>&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; );</DIV>
<DIV>&nbsp; metric-&gt;SetNumberOfHistogramBins( 50 );<BR>&nbsp; metric-&gt;SetNumberOfSpatialSamples( 10000 );</DIV>
<DIV>&nbsp; TransformType::Pointer&nbsp; transform = TransformType::New();<BR>&nbsp; registration-&gt;SetTransform( transform );<BR>&nbsp; typedef itk::ImageFileReader&lt; FixedImageType&nbsp; &gt; FixedImageReaderType;<BR>&nbsp; typedef itk::ImageFileReader&lt; MovingImageType &gt; MovingImageReaderType;<BR>&nbsp; FixedImageReaderType::Pointer&nbsp; fixedImageReader&nbsp; = FixedImageReaderType::New();<BR>&nbsp; MovingImageReaderType::Pointer movingImageReader = MovingImageReaderType::New();<BR>&nbsp; fixedImageReader-&gt;SetFileName(&nbsp; argv[1] );<BR>&nbsp; movingImageReader-&gt;SetFileName( argv[2] );</DIV>
<DIV><BR>&nbsp; registration-&gt;SetFixedImage(&nbsp;&nbsp;&nbsp; fixedImageReader-&gt;GetOutput()&nbsp;&nbsp;&nbsp; );<BR>&nbsp; registration-&gt;SetMovingImage(&nbsp;&nbsp; movingImageReader-&gt;GetOutput()&nbsp;&nbsp; );<BR>&nbsp; fixedImageReader-&gt;Update();<BR>&nbsp; registration-&gt;SetFixedImageRegion( <BR>&nbsp;&nbsp;&nbsp;&nbsp; fixedImageReader-&gt;GetOutput()-&gt;GetBufferedRegion() );</DIV>
<DIV>&nbsp; typedef itk::CenteredTransformInitializer&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; TransformType, <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; FixedImageType, <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; MovingImageType &gt;&nbsp; TransformInitializerType;<BR>&nbsp; TransformInitializerType::Pointer initializer = TransformInitializerType::New();<BR>&nbsp; initializer-&gt;SetTransform(&nbsp;&nbsp; transform );<BR>&nbsp; initializer-&gt;SetFixedImage(&nbsp;
 fixedImageReader-&gt;GetOutput() );<BR>&nbsp; initializer-&gt;SetMovingImage( movingImageReader-&gt;GetOutput() );<BR>&nbsp; initializer-&gt;MomentsOn();<BR>&nbsp; initializer-&gt;InitializeTransform();<BR>&nbsp; std::cout &lt;&lt; "Initial Transform Parameters " &lt;&lt; std::endl;<BR>&nbsp; std::cout &lt;&lt; transform-&gt;GetParameters() &lt;&lt; std::endl;<BR>&nbsp; <BR>// -----------------------<BR>&nbsp; registration-&gt;SetInitialTransformParameters( <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; transform-&gt;GetParameters() );</DIV>
<DIV><BR>&nbsp; double translationScale = 1.0 / 1000.0;<BR>&nbsp; if( argc &gt; 8 )<BR>&nbsp;&nbsp;&nbsp; {<BR>&nbsp;&nbsp;&nbsp; translationScale = atof( argv[8] );<BR>&nbsp;&nbsp;&nbsp; }<BR>&nbsp;typedef OptimizerType::ScalesType&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; OptimizerScalesType;<BR>&nbsp; OptimizerScalesType optimizerScales( transform-&gt;GetNumberOfParameters() );</DIV>
<DIV>&nbsp; optimizerScales[0] =&nbsp; 0.1;<BR>&nbsp; optimizerScales[1] =&nbsp; 0.1;<BR>&nbsp; optimizerScales[2] =&nbsp; 0.1;<BR>&nbsp; optimizerScales[3] =&nbsp; 0.1;<BR>&nbsp; optimizerScales[4] =&nbsp; translationScale;<BR>&nbsp; optimizerScales[5] =&nbsp; translationScale;<BR>&nbsp; optimizerScales[6] =&nbsp; translationScale;<BR>&nbsp; optimizerScales[7] =&nbsp; translationScale;</DIV>
<DIV>&nbsp; optimizer-&gt;SetScales( optimizerScales );<BR>&nbsp; double steplength = 0.1;</DIV>
<DIV>&nbsp; if( argc &gt; 6 )<BR>&nbsp;&nbsp;&nbsp; {<BR>&nbsp;&nbsp;&nbsp; steplength = atof( argv[6] );<BR>&nbsp;&nbsp;&nbsp; }</DIV>
<DIV><BR>&nbsp; unsigned int maxNumberOfIterations = 300;</DIV>
<DIV>&nbsp; if( argc &gt; 7 )<BR>&nbsp;&nbsp;&nbsp; {<BR>&nbsp;&nbsp;&nbsp; maxNumberOfIterations = atoi( argv[7] );<BR>&nbsp;&nbsp;&nbsp; }</DIV>
<DIV>&nbsp;&nbsp; optimizer-&gt;SetMaximumStepLength( steplength );&nbsp; <BR>&nbsp; optimizer-&gt;SetMinimumStepLength( 0.001 );<BR>&nbsp; optimizer-&gt;SetNumberOfIterations( maxNumberOfIterations );<BR>&nbsp; optimizer-&gt;MinimizeOn();</DIV>
<DIV>&nbsp; CommandIterationUpdate::Pointer observer = CommandIterationUpdate::New();<BR>&nbsp; optimizer-&gt;AddObserver( itk::IterationEvent(), observer );<BR>try <BR>&nbsp;&nbsp;&nbsp; { <BR>&nbsp;&nbsp;&nbsp; registration-&gt;StartRegistration(); <BR>&nbsp;&nbsp;&nbsp; } <BR>&nbsp; catch( itk::ExceptionObject &amp; err ) <BR>&nbsp;&nbsp;&nbsp; { <BR>&nbsp;&nbsp;&nbsp; std::cerr &lt;&lt; "ExceptionObject caught !" &lt;&lt; std::endl; <BR>&nbsp;&nbsp;&nbsp; std::cerr &lt;&lt; err &lt;&lt; std::endl; <BR>&nbsp;&nbsp;&nbsp; return -1;<BR>&nbsp;&nbsp;&nbsp; } <BR>&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();</DIV>
<DIV>&nbsp; const double finalRotationCenterX = finalParameters[4];<BR>&nbsp; const double finalRotationCenterY = finalParameters[5];<BR>&nbsp; const double finalTranslationX&nbsp;&nbsp;&nbsp; = finalParameters[6];<BR>&nbsp; const double finalTranslationY&nbsp;&nbsp;&nbsp; = finalParameters[7];</DIV>
<DIV>&nbsp; const unsigned int numberOfIterations = optimizer-&gt;GetCurrentIteration();<BR>&nbsp; const double bestValue = optimizer-&gt;GetValue();<BR>&nbsp; // Software Guide : EndCodeSnippet</DIV>
<DIV><BR>&nbsp; // Print out results<BR>&nbsp; //<BR>&nbsp; std::cout &lt;&lt; "Result = " &lt;&lt; std::endl;<BR>&nbsp; std::cout &lt;&lt; " Center X&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; = " &lt;&lt; finalRotationCenterX&nbsp; &lt;&lt; std::endl;<BR>&nbsp; std::cout &lt;&lt; " Center Y&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; = " &lt;&lt; finalRotationCenterY&nbsp; &lt;&lt; std::endl;<BR>&nbsp; std::cout &lt;&lt; " Translation X = " &lt;&lt; finalTranslationX&nbsp; &lt;&lt; std::endl;<BR>&nbsp; std::cout &lt;&lt; " Translation Y = " &lt;&lt; finalTranslationY&nbsp; &lt;&lt; std::endl;<BR>&nbsp; std::cout &lt;&lt; " Iterations&nbsp;&nbsp;&nbsp; = " &lt;&lt; numberOfIterations &lt;&lt; std::endl;<BR>&nbsp; std::cout &lt;&lt; " Metric value&nbsp; = " &lt;&lt; bestValue&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &lt;&lt; std::endl;<BR>&nbsp; typedef itk::ResampleImageFilter&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; MovingImageType, <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; FixedImageType &gt;&nbsp;&nbsp;&nbsp; ResampleFilterType;</DIV>
<DIV>&nbsp; TransformType::Pointer finalTransform = TransformType::New();</DIV>
<DIV>&nbsp; finalTransform-&gt;SetParameters( finalParameters );</DIV>
<DIV>&nbsp; ResampleFilterType::Pointer resample = ResampleFilterType::New();</DIV>
<DIV>&nbsp; resample-&gt;SetTransform( finalTransform );<BR>&nbsp; resample-&gt;SetInput( movingImageReader-&gt;GetOutput() );</DIV>
<DIV>&nbsp; FixedImageType::Pointer fixedImage = fixedImageReader-&gt;GetOutput();</DIV>
<DIV>&nbsp; resample-&gt;SetSize(&nbsp;&nbsp;&nbsp; fixedImage-&gt;GetLargestPossibleRegion().GetSize() );<BR>&nbsp; resample-&gt;SetOutputOrigin(&nbsp; fixedImage-&gt;GetOrigin() );<BR>&nbsp; resample-&gt;SetOutputSpacing( fixedImage-&gt;GetSpacing() );<BR>&nbsp; resample-&gt;SetDefaultPixelValue( 100 );<BR>&nbsp; <BR>&nbsp; typedef&nbsp; unsigned char&nbsp; OutputPixelType;</DIV>
<DIV>&nbsp; typedef itk::Image&lt; OutputPixelType, Dimension &gt; OutputImageType;<BR>&nbsp; <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; FixedImageType,<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; OutputImageType &gt; CastFilterType;<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; <BR>&nbsp; typedef itk::ImageFileWriter&lt; OutputImageType &gt;&nbsp; WriterType;</DIV>
<DIV><BR>&nbsp; WriterType::Pointer&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; writer =&nbsp; WriterType::New();<BR>&nbsp; CastFilterType::Pointer&nbsp; caster =&nbsp; CastFilterType::New();</DIV>
<DIV><BR>&nbsp; writer-&gt;SetFileName( argv[3] );</DIV>
<DIV><BR>&nbsp; caster-&gt;SetInput( resample-&gt;GetOutput() );<BR>&nbsp; writer-&gt;SetInput( caster-&gt;GetOutput()&nbsp;&nbsp; );<BR>&nbsp; writer-&gt;Update();</DIV>
<DIV><BR>&nbsp; typedef itk::SquaredDifferenceImageFilter&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; FixedImageType, <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; FixedImageType, <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; OutputImageType &gt; DifferenceFilterType;</DIV>
<DIV>&nbsp; DifferenceFilterType::Pointer difference = DifferenceFilterType::New();</DIV>
<DIV>&nbsp; WriterType::Pointer writer2 = WriterType::New();<BR>&nbsp; writer2-&gt;SetInput( difference-&gt;GetOutput() );&nbsp; <BR>&nbsp; </DIV>
<DIV>&nbsp; if( argc &gt; 4 )<BR>&nbsp;&nbsp;&nbsp; {<BR>&nbsp;&nbsp;&nbsp; difference-&gt;SetInput1( fixedImageReader-&gt;GetOutput() );<BR>&nbsp;&nbsp;&nbsp; difference-&gt;SetInput2( resample-&gt;GetOutput() );<BR>&nbsp;&nbsp;&nbsp; writer2-&gt;SetFileName( argv[4] );<BR>&nbsp;&nbsp;&nbsp; writer2-&gt;Update();<BR>&nbsp;&nbsp;&nbsp; }</DIV>
<DIV><BR>&nbsp; if( argc &gt; 5 )<BR>&nbsp;&nbsp;&nbsp; {<BR>&nbsp;&nbsp;&nbsp; writer2-&gt;SetFileName( argv[5] );<BR>&nbsp;&nbsp;&nbsp; difference-&gt;SetInput1( fixedImageReader-&gt;GetOutput() );<BR>&nbsp;&nbsp;&nbsp; difference-&gt;SetInput2( movingImageReader-&gt;GetOutput() );<BR>&nbsp;&nbsp;&nbsp; writer2-&gt;Update();<BR>&nbsp;&nbsp;&nbsp; }</DIV>
<DIV><BR>&nbsp; return 0;<BR>}</DIV>
<DIV>&nbsp;</DIV><p>
                <hr size=1>
Créez gratuitement votre Yahoo! Mail avec <font color="red"><b>100 Mo de stockage !</b></font>
<br><a href="http://fr.rd.yahoo.com/mail/taglines/*http://fr.rd.yahoo.com/evt=25917/*http://fr.rd.yahoo.com/mail/mail_taglines_100/default/*http://fr.benefits.yahoo.com/">Créez votre Yahoo! Mail</a><br><br>
<font color="red"><b>Le nouveau Yahoo! Messenger est arrivé !</b></font> Découvrez toutes les nouveautés pour dialoguer instantanément avec vos amis.
<a href="http://fr.rd.yahoo.com/mail/taglines/*http://fr.rd.yahoo.com/evt=26111/*http://fr.rd.yahoo.com/messenger/mail_taglines/default/*http://fr.messenger.yahoo.com">Téléchargez GRATUITEMENT ici !</a>