hi, <div>Thanks Bill, yes, i didnt think about it :&quot;<div>I tried, there is no exception (in both cases i mentioned in my last post)</div><div><br></div><div>Quyps,</div><div><br></div><div><div><br><div class="gmail_quote">
2009/10/5 Bill Lorensen <span dir="ltr">&lt;<a href="mailto:bill.lorensen@gmail.com">bill.lorensen@gmail.com</a>&gt;</span><br><blockquote class="gmail_quote" style="margin:0 0 0 .8ex;border-left:1px #ccc solid;padding-left:1ex;">
The difference could be that the internal values have higher precision<br>
than the printed values.<br>
<br>
You should be getting an exception with the try/catch.<br>
<div><div></div><div class="h5"><br>
<br>
On Sun, Oct 4, 2009 at 1:51 PM, Quy Pham Sy &lt;<a href="mailto:phamsyquybk@gmail.com">phamsyquybk@gmail.com</a>&gt; wrote:<br>
&gt; hi,  Bill<br>
&gt; Thanks very much for you help. I tried adding your code. Actually your code<br>
&gt; outputs the metric value to screen, am i right?<br>
&gt; To make all my question clearer<br>
&gt; here is the summary, there&#39;re issues:<br>
&gt;<br>
&gt; 1 - When I used the output (final transform parameters) from<br>
&gt; ImageRegistration7 example (in ITK source code)<br>
&gt; to reproduce the metric  value directly from Metric Object (same as metric<br>
&gt; object type used in ImageRegistration7 example)<br>
&gt; I can not reproduce the same metric value as the example. Why?<br>
&gt;<br>
&gt; Output from ImageRegistration7<br>
&gt; -------------------------------------<br>
&gt;  Scale         = 1.08438<br>
&gt;  Angle (radians) 0.154531<br>
&gt;  Angle (degrees) 8.85397<br>
&gt;  Center X      = 170.327<br>
&gt;  Center Y      = 148.556<br>
&gt;  Translation X = -26.6822<br>
&gt;  Translation Y = -93.4428<br>
&gt;  Iterations    = 500<br>
&gt;  Metric value  = 4551.86<br>
&gt; ---------------------------------------<br>
&gt; Two input image: fixed.bmp; moving.bmp<br>
&gt; Set params code for transformation of metric<br>
&gt; ---------------------------------------------------<br>
&gt; transform-&gt;SetScale(1.08438);<br>
&gt; transform-&gt;SetAngle(0.154531);<br>
&gt; TransformType::TranslationType translation;<br>
&gt; translation[0] = -26.6822;<br>
&gt; translation[1] = -93.6822;<br>
&gt; transform-&gt;SetTranslation(translation);<br>
&gt; MetricType::TransformParametersType transformParams =<br>
&gt; transform-&gt;GetParameters();<br>
&gt;<br>
&gt; double metricval = metric-&gt;GetValue(transformParams);<br>
&gt; /*result: metricval = 4570.285 still != 4551.86*/<br>
&gt; ----------------------------------------------------<br>
&gt;<br>
&gt; 2. In theory,  the metric value from registration (determined by: transform<br>
&gt; type, metric type, interpolate type) of two images (fixed image, moving<br>
&gt; image) is supposed to be &quot;MINIMUM METRIC VALUE&quot;.<br>
&gt; But when i try a set of params (as following) i get a smaller value, event<br>
&gt; down to 0 (still use two input image as above) the value which is impossible<br>
&gt; since two images are not identical !!!<br>
&gt; ----------------------------------------------<br>
&gt; transform-&gt;SetScale(0.92632);<br>
&gt; transform-&gt;SetAngle(0.15095);<br>
&gt; TransformType::TranslationType translation;<br>
&gt; translation[0] = 28.29828;<br>
&gt; translation[1] = 94.07266;<br>
&gt; transform-&gt;SetTranslation(translation);<br>
&gt; MetricType::TransformParametersType transformParams =<br>
&gt; transform-&gt;GetParameters();<br>
&gt;<br>
&gt; double metricval = metric-&gt;GetValue(transformParams);<br>
&gt; /*result: metricval == 0 !!!! */<br>
&gt; -------------------------------------------------<br>
&gt; Really appreciate any suggest and help!<br>
&gt; //========================================================================<br>
&gt; //              HERE IS THE SOURCE CODE TO REPRODUCE THESE PROBLEMS<br>
&gt; //========================================================================<br>
&gt; int main( int argc, char * argv[] )<br>
&gt; {<br>
&gt; const     unsigned int   Dimension = 2;<br>
&gt; typedef   unsigned char  PixelType;<br>
&gt; typedef itk::Image&lt; PixelType, Dimension &gt;   ImageType;<br>
&gt; typedef itk::ImageFileReader&lt; ImageType &gt;  ReaderType;<br>
&gt; ReaderType::Pointer fixedReader  = ReaderType::New();<br>
&gt; ReaderType::Pointer movingReader = ReaderType::New();<br>
&gt;   fixedReader-&gt;SetFileName(  &quot;fixed.bmp&quot; );<br>
&gt;   movingReader-&gt;SetFileName( &quot;moving.bmp&quot; );<br>
&gt;<br>
&gt; try<br>
&gt; {<br>
&gt; fixedReader-&gt;Update();<br>
&gt; movingReader-&gt;Update();<br>
&gt; }<br>
&gt; catch( itk::ExceptionObject &amp; excep )<br>
&gt; {<br>
&gt; std::cerr &lt;&lt; &quot;Exception catched !&quot; &lt;&lt; std::endl;<br>
&gt; std::cerr &lt;&lt; excep &lt;&lt; std::endl;<br>
&gt; }<br>
&gt;<br>
&gt; typedef itk::MeanSquaresImageToImageMetric&lt; ImageType, ImageType &gt;<br>
&gt;  MetricType;<br>
&gt; MetricType::Pointer metric = MetricType::New();<br>
&gt; typedef itk::CenteredSimilarity2DTransform &lt; double &gt;  TransformType;<br>
&gt; TransformType::Pointer transform = TransformType::New();<br>
&gt; typedef itk::LinearInterpolateImageFunction&lt; ImageType, double &gt;<br>
&gt;  InterpolatorType;<br>
&gt; InterpolatorType::Pointer interpolator = InterpolatorType::New();<br>
&gt; ImageType::Pointer fixedImage  = fixedReader-&gt;GetOutput();<br>
&gt; ImageType::Pointer movingImage = movingReader-&gt;GetOutput();<br>
&gt; typedef itk::CenteredTransformInitializer&lt; TransformType, ImageType,<br>
&gt; ImageType &gt;  TransformInitializerType;<br>
&gt; TransformInitializerType::Pointer initializer =<br>
&gt; TransformInitializerType::New();<br>
&gt; initializer-&gt;SetTransform(   transform );<br>
&gt; initializer-&gt;SetFixedImage(  fixedImage );<br>
&gt; initializer-&gt;SetMovingImage( movingImage );<br>
&gt; initializer-&gt;MomentsOn();<br>
&gt; initializer-&gt;InitializeTransform();<br>
&gt; metric-&gt;SetTransform( transform );<br>
&gt; metric-&gt;SetInterpolator( interpolator );<br>
&gt; metric-&gt;SetFixedImage(  fixedImage  );<br>
&gt; metric-&gt;SetMovingImage( movingImage );<br>
&gt; metric-&gt;SetFixedImageRegion(  fixedImage-&gt;GetBufferedRegion()  );<br>
&gt; try<br>
&gt; {<br>
&gt; metric-&gt;Initialize();<br>
&gt; }<br>
&gt; catch( itk::ExceptionObject &amp; excep )<br>
&gt; {<br>
&gt; std::cerr &lt;&lt; &quot;Exception catched !&quot; &lt;&lt; std::endl;<br>
&gt; std::cerr &lt;&lt; excep &lt;&lt; std::endl;<br>
&gt; return EXIT_FAILURE;<br>
&gt; }<br>
&gt; //************************************************************************/<br>
&gt;         //  CHANGE PARAMETERS HERE TO REPRODUCE PROBLEM<br>
&gt; transform-&gt;SetScale(0.92632);<br>
&gt; transform-&gt;SetAngle(0.15095);<br>
&gt; TransformType::TranslationType translation;<br>
&gt; translation[0] = 28.29828;<br>
&gt; translation[1] = 94.07266;<br>
&gt;<br>
&gt; //*************************************************************************/<br>
&gt;<br>
&gt; transform-&gt;SetTranslation(translation);<br>
&gt; MetricType::TransformParametersType transformParams =<br>
&gt; transform-&gt;GetParameters();<br>
&gt; double metricval = 0.0;<br>
&gt; try<br>
&gt; {<br>
&gt; metricval = metric-&gt;GetValue(transformParams);<br>
&gt; std::cout &lt;&lt; &quot;metricval: &quot; &lt;&lt; metricval &lt;&lt; std::endl;<br>
&gt; }<br>
&gt; catch( itk::ExceptionObject &amp; excep )<br>
&gt; {<br>
&gt; std::cerr &lt;&lt; &quot;Exception catched !&quot; &lt;&lt; std::endl;<br>
&gt; std::cerr &lt;&lt; excep &lt;&lt; std::endl;<br>
&gt; std::cout &lt;&lt; &quot;metricval: &quot; &lt;&lt; metricval &lt;&lt; std::endl;<br>
&gt; return EXIT_FAILURE;<br>
&gt; }<br>
&gt; return EXIT_SUCCESS;<br>
&gt; }<br>
&gt; =======================================================================================<br>
&gt;<br>
</div></div></blockquote></div><br>
</div></div></div>