Hi Luis<br><br>I changed the transform to Similarity2DTransform as you proposed and had much better results.<br>The changes were ...<br>////&nbsp; METRIC SCALES<div class="Ih2E3d"><br>typedef MetricType::ScalesType ScalesType;<br>
ScalesType scales( numberOfParameters );<br></div>

scales[0] =&nbsp; 10.0; //scale<br>scales[1] =&nbsp; 1.0; //angle<br>scales[2] =&nbsp; 0.01; //Translation X<br>scales[3] =&nbsp; 0.01; //Translation Y<br>&nbsp;metric-&gt;SetDerivativeStepLengt<div id="1fi9" class="ArwC7c ckChnd">hScales(scales);<br>
.......<br>///// OPTIMIZER SCALES <br>

<br>&nbsp;&nbsp; FixedImageType::RegionType region = fixedImage-&gt;GetLargestPossibleRegion();<br>&nbsp; FixedImageType::SizeType size = region.GetSize();<br>&nbsp; FixedImageType::SpacingType spacing = fixedImage-&gt;GetSpacing();<div class="Ih2E3d">
<br><br>
&nbsp; typedef OptimizerType::ScalesType&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; OptimizerScalesType;<br>
&nbsp; OptimizerScalesType optimizerScales( transform-&gt;GetNumberOfParameters() );<br></div>&nbsp; optimizerScales[0] = 10.0;<br>&nbsp; optimizerScales[1] =&nbsp; 10.0;<br>&nbsp; optimizerScales[2] =&nbsp;&nbsp; 1.0 / ( 0.1 * size[0] * spacing[0] );<br>
&nbsp; optimizerScales[3] =&nbsp;&nbsp; 1.0 / ( 0.1 * size[1] * spacing[1] );<br>

&nbsp; optimizer-&gt;SetScales( optimizerScales );<br>...............<br>















<p><br></p><p>results (5000 iterations)&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; <span><br></span>scale
0.833371,&nbsp; <span></span>angle
-0.175554,<span>&nbsp; </span>TrX<span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </span>7.3605,<span>&nbsp; </span>TrY<span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </span>7.89029,<span> </span>Metric
1.31231,<span>MSDafter</span>
204.473, CCafter<span></span><span>&nbsp;&nbsp;&nbsp; </span>0.984774</p><p>MSD=MeanSquareDifference after registration, CC=CorrelationCoefficient after registration</p><p>

</p>









<p>results (7000 iterations)<span><br></span>scale
0.833493, <span></span>angle
-0.175483,<span> &nbsp; </span>TrX<span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </span>7.21419,<span></span>TrY<span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </span>7.7625,<span>&nbsp;&nbsp; </span>Metric
1.33357,<span></span>MSDafter
153.119,<span>&nbsp; </span>CC<span>after &nbsp;&nbsp; </span>0.988688</p>

<p>

</p><p>results (15000 iterations)<br>scale
0.833746,<span> </span>angle
-0.174136,&nbsp;&nbsp; <span></span>TrX<span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </span>6.86705,<span></span>TrY<span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </span>7.43349,<span></span>Metric
1.31354, MSDafter 182.968,&nbsp; <span></span>CC<span>after &nbsp;&nbsp;</span><span> </span>0.986441 <br></p><p>The &quot;optimum&quot; results taken from mattes metric where

</p>













<p>results<span><br></span>scale
0.832628<span> </span>angle
-0.174455<span>&nbsp; </span>TrX<span>&nbsp;&nbsp; </span>7.37987<span>&nbsp;&nbsp;&nbsp; </span>TrY<span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </span>8.52768<span>&nbsp; </span>Metric
-1.42415<span>&nbsp; </span>MSDafter
77.9344<span></span>&nbsp;&nbsp;&nbsp; CC<span>after &nbsp;&nbsp; </span>0.994369</p>

<br><div class="gmail_quote">The problem with the results I got, and which are presented above are:<br>1)
NMI metric reached the maximum number of iterations, (and took a rather
long time (approx 3sec/iteration.) although that was expected) Should I
set the number of iterations, approx in that number, that I take the
better results?<br>
2) With the parameters I set the optimizer,&nbsp; and metric scales, the
algorithm was pretty close to the optimum results. But when it reached
some of them, it kept running in a steady mode, not converging towards
them.<br><br>
Is there any possible solution to these problems?<br>Thanks,<br><font color="#888888">Giorgos</font></div></div><br><br><div class="gmail_quote">On Mon, May 12, 2008 at 6:49 PM, Luis Ibanez &lt;<a href="mailto:luis.ibanez@kitware.com">luis.ibanez@kitware.com</a>&gt; wrote:<br>
<blockquote class="gmail_quote" style="border-left: 1px solid rgb(204, 204, 204); margin: 0pt 0pt 0pt 0.8ex; padding-left: 1ex;"><br>
Hi Giorgos,<br>
<br>
Thanks for posting your progress on this problem.<br>
<br>
Here are some comments:<br>
<br>
1) Yes, when using Normalized Mutual Information<br>
 &nbsp; you should set the optimizer to &quot;maximize&quot;.<br>
 &nbsp; You are doing this right by calling<br>
 &nbsp; &quot;optimizer-&gt;MaximizeOn();&quot;<br>
<br>
 &nbsp; see for example<br>
<br>
 &nbsp; Insight/Examples/Registration/ImageRegistration14.cxx<br>
<br>
<br>
2) The Optimizer scales are definitely a good place<br>
 &nbsp; to look for a culprit.<br>
<br>
 &nbsp; With your current scale selection you are actually<br>
 &nbsp; telling the optimizer to avoid changing the values<br>
 &nbsp; of the Transform&#39;s center of rotation, which is a<br>
 &nbsp; good thing.<br>
<br>
 &nbsp; One thing you should try is replacing the<br>
<br>
 &nbsp; &nbsp; &nbsp; &nbsp;itkCenteredSimilarity2DTransform<br>
<br>
 &nbsp; with the<br>
<br>
 &nbsp; &nbsp; &nbsp; &nbsp;itkSimilarity2DTransform<br>
<br>
 &nbsp; The second one still offers the user the possibility<br>
 &nbsp; of setting a customized a center of rotation, but<br>
 &nbsp; as opposed to the first one, it doesn&#39;t include the<br>
 &nbsp; center coordinates in the list of parameters to be<br>
 &nbsp; optimized. In other words, with the second transform<br>
 &nbsp; the optimizer will not try to change the center of<br>
 &nbsp; rotation.<br>
<br>
 &nbsp; Historical note: initially ITK transforms didn&#39;t<br>
 &nbsp; provided a SetCenter() method. E.g. by default,<br>
 &nbsp; all rotations and scalings were performed with<br>
 &nbsp; respect to the origin (0,0).<br>
<br>
 &nbsp; Later on we introduced the variants of Transform with<br>
 &nbsp; center of rotation, and we called &quot;Centered&quot; transforms,<br>
 &nbsp; however, we made the mistake of including the coordinate<br>
 &nbsp; of the center of rotation in the list of parameters to<br>
 &nbsp; optimize.<br>
<br>
 &nbsp; Later on it was decided that almost all transforms<br>
 &nbsp; needed a customizable center of rotation, and the<br>
 &nbsp; functionality was added to the basic transform, but<br>
 &nbsp; without inserting the coordinates of the center of<br>
 &nbsp; rotation in to the parameters array.<br>
<br>
 &nbsp; Allowing the optimizer to move the center of rotation<br>
 &nbsp; makes the Transform to behave very unstably, and therefore<br>
 &nbsp; should only be done by allowing the optimizer to make<br>
 &nbsp; very small changes in the center of rotation (as you<br>
 &nbsp; already discovered).<br>
<br>
 &nbsp; Switching to the itkSimilarity2DTransform may alleviate<br>
 &nbsp; some of the stability problems that you are facing.<br>
<br>
 &nbsp; Please note that the Similarity2DTransform have *less*<br>
 &nbsp; parameters. Only four, instead of the six parameters<br>
 &nbsp; in the CenteredSimilarity2DTransform.<br>
<br>
 &nbsp; Note also that the &quot;Scale&quot; and &quot;Angle&quot; parameters are<br>
 &nbsp; still critical in this transforms and you should apply<br>
 &nbsp; the same approach that you have used for the Centered<br>
 &nbsp; transform. (e.g. using different optimizer scalings<br>
 &nbsp; for these two first parameters of the Transform).<br>
<br>
<br>
<br>
Please give it a try at this modification and<br>
let us know how it works for you.<div class="Ih2E3d"><br>
<br>
<br>
 &nbsp; Thanks<br>
<br>
<br>
 &nbsp; &nbsp; &nbsp;Luis<br>
<br>
<br>
---------------------<br>
Giorgos Pichis wrote:<br>
</div><blockquote class="gmail_quote" style="border-left: 1px solid rgb(204, 204, 204); margin: 0pt 0pt 0pt 0.8ex; padding-left: 1ex;"><div><div></div><div class="Wj3C7c">
Hi,<br>
I made some changes to the code,<br>
and it seems as it is having better results,<br>
but they are still far from the optimum.<br>
<br>
I am using the BrainProtonDensitySlice.png &nbsp;and BrainProtonDensitySliceR10X13Y17S12.png from<br>
the examples data to test the algorithm.<br>
<br>
As far as the metric parameters are concerned , I did the following changes:<br>
//////////////////////<br>
 &nbsp;const unsigned int numberOfParameters = transform-&gt;GetNumberOfParameters();<br>
<br>
 &nbsp;typedef MetricType::ScalesType ScalesType;<br>
 &nbsp;ScalesType scales( numberOfParameters );<br>
double t_scale;<br>
double center_scale;<br>
 &nbsp;//scales.Fill( 1.0 );<br>
 &nbsp; &nbsp;std::cout&lt;&lt;&quot; enter center_scale : &quot;;<br>
 &nbsp;std::cin&gt;&gt;center_scale;<br>
 &nbsp;std::cout&lt;&lt;&quot; enter t_scale : &quot;;<br>
 &nbsp;std::cin&gt;&gt;t_scale;<br>
 &nbsp;std::cout&lt;&lt;&quot; enter scales[0] : &quot;; //scaling<br>
 &nbsp;std::cin&gt;&gt;scales[0];<br>
&nbsp; &nbsp;std::cout&lt;&lt;&quot; enter scales[1] : &quot;; //angle<br>
 &nbsp;std::cin&gt;&gt;scales[1];<br>
&nbsp; &nbsp;//const double t_scale=0.1; //translation scale<br>
 &nbsp;//scales[0] = &nbsp;10.0;<br>
 &nbsp;//scales[1] = &nbsp;1.0;<br>
 &nbsp;scales[2] = &nbsp;center_scale;<br>
 &nbsp;scales[3] = &nbsp;center_scale;<br>
 &nbsp;scales[4] = &nbsp;t_scale;<br>
 &nbsp;scales[5] = &nbsp;t_scale;<br>
<br>
 &nbsp;  &nbsp;metric-&gt;SetDerivativeStepLengthScales(scales);<br>
 &nbsp;metric-&gt;SetDerivativeStepLength(1.0);<br>
<br>
/////////<br>
... and had some relatively (to the previous ones) good results, using:<br>
center_scale :10000,<br>
t_scale: 0.1<br>
scale[0] :0.1 &nbsp;//for scaling<br>
scale[1] :1 &nbsp;//for the angle<br>
<br>
Also the optimizer setting where changes to:<br>
<br>
<br>
 &nbsp;typedef OptimizerType::ScalesType &nbsp; &nbsp; &nbsp; OptimizerScalesType;<br>
 &nbsp;OptimizerScalesType optimizerScales( transform-&gt;GetNumberOfParameters() );<br>
 &nbsp;const double translationScale = 1.0 / 100.0;<br>
 &nbsp;const double centerScale =1.0/100.0;<br>
<br>
 &nbsp;optimizerScales[0] = 10.0;<br>
 &nbsp;optimizerScales[1] = &nbsp;1.0;<br>
 &nbsp;optimizerScales[2] = &nbsp;centerScale;<br>
 &nbsp;optimizerScales[3] = &nbsp;centerScale;<br>
 &nbsp;optimizerScales[4] = &nbsp;translationScale;<br>
 &nbsp;optimizerScales[5] = &nbsp;translationScale;<br>
<br>
 &nbsp;optimizer-&gt;SetScales( optimizerScales );<br>
<br>
 &nbsp;double steplength = 1.0;<br>
&nbsp; &nbsp;if( argc &gt; 9 )<br>
 &nbsp; &nbsp;{<br>
 &nbsp; &nbsp;steplength = atof( argv[9] );<br>
 &nbsp; &nbsp;}<br>
 &nbsp;optimizer-&gt;SetMaximumStepLength( steplength );<br>
 &nbsp;optimizer-&gt;SetMinimumStepLength( 0.00001 );<br>
 &nbsp;optimizer-&gt;SetNumberOfIterations( 500 );<br>
&nbsp;optimizer-&gt;MaximizeOn(); //change<br>
.... using step lenght=0.5<br>
The algorithm exited, at iteration number 70,<br>
with<br>
Scale 1.00275<br>
Angle (radians) -0.160493<br>
Angle (degrees) -9.19556<br>
Center X = 90.318<br>
Center Y = 108.849<br>
Translation X=15.2579<br>
Translation Y= 15.4322<br>
Metric Value= 1.07114<br>
<br>
Can I get some help , on what further changes should I do,<br>
in order to get better results?<br>
I had almost optimum results working with Mattes MI,<br>
Scale 0.832628<br>
Angle (radians) -0.174455<br>
Angle (degrees) -9.99554<br>
Center X = 87.1628<br>
Center Y = 107.813<br>
Translation X=7.37987<br>
Translation Y= 8.52768<br>
Metric Value= -1.42415,<br>
but I want to get familiar and work with NMI.<br>
What changes to the scales parameters, should I do?<br>
<br>
Thanks in advance,<br>
Giorgos<br>
<br>
<br>
<br>
<br>
<br></div></div><div class="Ih2E3d">
------------------------------------------------------------------------<br>
<br>
_______________________________________________<br>
Insight-users mailing list<br>
<a href="mailto:Insight-users@itk.org" target="_blank">Insight-users@itk.org</a><br>
<a href="http://www.itk.org/mailman/listinfo/insight-users" target="_blank">http://www.itk.org/mailman/listinfo/insight-users</a><br>
</div></blockquote>
</blockquote></div><br>