Dear all,<br><br>I am trying to check the metric (Mattes MI) values between two images, while rotating the one over the other.<br>Therefore I use Euler2DTransform. <br>The results though of the plot aren&#39;t the expected.<br>
I am comparing two test images where the one is rotated 10 degrees over the other,<br>and the metric minimum is appeared in the value 1.<br>Do you know what might be the problem, or what should I change in the following code?<br>
<br>Thanks a lot<br>Best Regards<br>Giorgos <br>........................................................................<br>#include &quot;itkImage.h&quot;<br>#include &quot;itkImageFileReader.h&quot;<br>#include &quot;itkImageFileWriter.h&quot;<br>
#include &quot;itkMattesMutualInformationImageToImageMetric.h&quot;<br>#include &quot;itkEuler2DTransform.h&quot;<br>
#include &quot;itkLinearInterpolateImageFunction.h&quot;<br><br>int main( int argc, char * argv[] )<br>{<br>&nbsp; if( argc &lt; 3 )<br>&nbsp;&nbsp;&nbsp; {<br>&nbsp;&nbsp;&nbsp; std::cerr &lt;&lt; &quot;Usage: &quot; &lt;&lt; std::endl;<br>&nbsp;&nbsp;&nbsp; std::cerr &lt;&lt; argv[0] &lt;&lt; &quot;&nbsp; fixedImage&nbsp; movingImage&quot; &lt;&lt; std::endl;<br>

&nbsp;&nbsp;&nbsp; return 1;<br>&nbsp;&nbsp;&nbsp; }<br><br>&nbsp; const&nbsp;&nbsp;&nbsp;&nbsp; unsigned int&nbsp;&nbsp; Dimension = 2;<br>&nbsp; typedef&nbsp;&nbsp; unsigned char&nbsp; PixelType;<br>&nbsp; typedef itk::Image&lt; PixelType, Dimension &gt;&nbsp;&nbsp; ImageType;<br>&nbsp; typedef itk::Image&lt; PixelType, Dimension &gt;&nbsp;&nbsp; ImageType;<br>

&nbsp; typedef itk::ImageFileReader&lt; ImageType &gt;&nbsp; ReaderType;<br><br>&nbsp; ReaderType::Pointer fixedReader&nbsp; = ReaderType::New();<br>&nbsp; ReaderType::Pointer movingReader = ReaderType::New();<br><br>&nbsp; fixedReader-&gt;SetFileName(&nbsp; argv[ 1 ] );<br>

&nbsp; movingReader-&gt;SetFileName( argv[ 2 ] );<br><br>&nbsp; try <br>&nbsp;&nbsp;&nbsp; {<br>&nbsp;&nbsp;&nbsp; fixedReader-&gt;Update();<br>&nbsp;&nbsp;&nbsp; movingReader-&gt;Update();<br>&nbsp;&nbsp;&nbsp; }<br>&nbsp; catch( itk::ExceptionObject &amp; excep )<br>&nbsp;&nbsp;&nbsp; {<br>&nbsp;&nbsp;&nbsp; std::cerr &lt;&lt; &quot;Exception catched !&quot; &lt;&lt; std::endl;<br>

&nbsp;&nbsp;&nbsp; std::cerr &lt;&lt; excep &lt;&lt; std::endl;<br>&nbsp;&nbsp;&nbsp; }<br><br>&nbsp; typedef itk::MattesMutualInformationImageToImageMetric&lt; ImageType, ImageType &gt;&nbsp; MetricType;<br>&nbsp; MetricType::Pointer metric = MetricType::New();<br>

<br>&nbsp; typedef itk::Euler2DTransform&lt; double &gt;&nbsp; TransformType;<br>&nbsp; TransformType::Pointer transform = TransformType::New();<br><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; ImageType, double &gt;&nbsp; InterpolatorType;<br>

&nbsp; InterpolatorType::Pointer interpolator = InterpolatorType::New();<br><br>&nbsp; metric-&gt;SetInterpolator( interpolator );<br>&nbsp; metric-&gt;SetTransform( transform );<br><br>&nbsp; metric-&gt;SetNumberOfHistogramBins( 20 );<br>&nbsp; metric-&gt;SetNumberOfSpatialSamples( 10000 );<br>

<br>&nbsp;transform-&gt;SetIdentity();<br><br>&nbsp; ImageType::ConstPointer fixedImage&nbsp; = fixedReader-&gt;GetOutput();<br>&nbsp; ImageType::ConstPointer movingImage = movingReader-&gt;GetOutput();<br><br>&nbsp; metric-&gt;SetFixedImage(&nbsp; fixedImage&nbsp; );<br>

&nbsp; metric-&gt;SetMovingImage( movingImage );<br><br>&nbsp; metric-&gt;SetFixedImageRegion(&nbsp; fixedImage-&gt;GetBufferedRegion()&nbsp; );<br><br>&nbsp; try <br>&nbsp;&nbsp;&nbsp; {<br>&nbsp;&nbsp;&nbsp; metric-&gt;Initialize();<br>&nbsp;&nbsp;&nbsp; }<br>&nbsp; catch( itk::ExceptionObject &amp; excep )<br>

&nbsp;&nbsp;&nbsp; {<br>&nbsp;&nbsp;&nbsp; std::cerr &lt;&lt; &quot;Exception catched !&quot; &lt;&lt; std::endl;<br>&nbsp;&nbsp;&nbsp; std::cerr &lt;&lt; excep &lt;&lt; std::endl;<br>&nbsp;&nbsp;&nbsp; return -1;<br>&nbsp;&nbsp;&nbsp; }<br><br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; MetricType::TransformParametersType parameters( transform-&gt;GetNumberOfParameters() );<br>

&nbsp; <br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; int RangeOfDegrees=50;<br>&nbsp;&nbsp;&nbsp; &nbsp; double RangeInRadians=RangeOfDegrees * atan(1.0)/45.0;<br>&nbsp;&nbsp;&nbsp; &nbsp; <br>&nbsp;&nbsp;&nbsp; &nbsp; for (double i=-RangeInRadians; i&lt;=RangeInRadians; i+=atan(1.0)/45.0)<br>&nbsp;&nbsp;&nbsp; &nbsp; {<br>&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp;&nbsp;&nbsp; parameters[0] = i;<br>

&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; parameters[1] = 0;<br>&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp;&nbsp;&nbsp; parameters[2] = 0;<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; <br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; const double value = metric-&gt;GetValue( parameters );<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; double finalAngleInDegrees = i * 45.0 / atan(1.0);<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; std::cout &lt;&lt; finalAngleInDegrees &lt;&lt; &quot;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &quot;&nbsp; &lt;&lt; value &lt;&lt; std::endl;<br>

&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; }<br>&nbsp; std::cout &lt;&lt; std::endl;<br>&nbsp; return 0;<br>}<br>