<br>Hi <span dir="ltr">itkvtk123</span>,<br><br>The iteration reporting of the OnePlusOneOptimizer<br>tends to be misleading because it reports the &quot;best&quot;<br>value found so far. <br><br>As you probably know, this optimizer works by generating<br>
random positions around the last &quot;best position&quot;, at every<br>iteration it tries a group of new positions, and if none of them<br>returns a better value, then the &quot;best value so far&quot; is still<br>reported in the output.<br>
<br>So, it is normal for this optimizer to report for several iterations<br>(sometimes hundreds) the same metric value (and position <br>value), and then switch to another value when a better metric <br>value is found.<br>
<br>In general, if you see the same value for a long time, it<br>means that you are not setting the optimizer to explore<br>values in a large enough region. That is, it may be <br>constrained to a small region.<br><br><br>
Two things are strange in your report:<br><br>1) You say that you see always values of zeros in the <br>     transform parameters, but at the same time you <br>     are using the Transform initializer.<br>   <br>     Can you verify that the First transform (the one computed<br>
     by the initializer) also has values of zeros in its parameters ?<br><br>2)  You are setting a value of Epsilon = 1.0, which may be<br>     too small for generating parameters variations that will<br>      move you more than one pixel away.<br>
<br>     You may want to try with larger Epsilon values (in the order<br>     of 10.0 or larger).<br><br><br><br>   Luis<br><br><br><br>------------------------------------------------------<br><div class="gmail_quote">On Wed, Sep 9, 2009 at 8:06 AM,  <span dir="ltr">&lt;<a href="mailto:itkvtk123@gmx.net">itkvtk123@gmx.net</a>&gt;</span> wrote:<br>
<blockquote class="gmail_quote" style="border-left: 1px solid rgb(204, 204, 204); margin: 0pt 0pt 0pt 0.8ex; padding-left: 1ex;">Hi!<br>
<br>
I&#39;m trying to register two 2d images using the OnePlusOne optimizer (global optimization).<br>
I wanted to give it a try because gradient descent got stuck in local minima all the time.<br>
<br>
However, the result of the OnePlusOne is always Rotation=0, TranslationX=0, TranslationY=0.<br>
(Same during entire process -&gt; I monitored it using the observer).<br>
<br>
I&#39;m using the NormalizedCorrelationMetric.<br>
Am I doing something wrong or is something missing? (see code)<br>
<br>
Take also a look at<br>
<br>
<a href="http://img3.imageshack.us/img3/1552/unbenannttnb.jpg" target="_blank">http://img3.imageshack.us/img3/1552/unbenannttnb.jpg</a><br>
<br>
for a screenshot of my program (lower left = image 1, lower right = image 2, upper left = subtraction image after registration).<br>
<br>
Source:<br>
<br>
const Image2DType::Pointer ImageRegistration::registerImagesXYR(const Image2DType::Pointer fixedImage, const Image2DType::Pointer movingImage)<br>
{<br>
        typedef itk::CenteredRigid2DTransform&lt;double&gt; RigidTransformType;<br>
        typedef itk::CenteredTransformInitializer&lt;RigidTransformType, Image2DType, Image2DType&gt;  TransformInitializerType;<br>
        typedef itk::NormalizedCorrelationImageToImageMetric&lt;Image2DType, Image2DType&gt; MetricType;<br>
        typedef itk::OnePlusOneEvolutionaryOptimizer OptimizerType;<br>
        typedef itk::Statistics::NormalVariateGenerator GeneratorType;<br>
        typedef itk::LinearInterpolateImageFunction&lt;Image2DType, double&gt; InterpolatorType;<br>
        typedef itk::ImageRegistrationMethod&lt;Image2DType, Image2DType&gt; RegistrationType;<br>
<br>
<br>
<br>
        //initialize needed objects<br>
        MetricType::Pointer metric = MetricType::New();<br>
        RigidTransformType::Pointer transform = RigidTransformType::New();<br>
        OptimizerType::Pointer optimizer = OptimizerType::New();<br>
        InterpolatorType::Pointer interpolator = InterpolatorType::New();<br>
        RegistrationType::Pointer registration = RegistrationType::New();<br>
<br>
        //connect objects to registration<br>
        registration-&gt;SetMetric(metric);<br>
        registration-&gt;SetOptimizer(optimizer);<br>
        registration-&gt;SetTransform(transform);<br>
        registration-&gt;SetInterpolator(interpolator);<br>
<br>
        TransformInitializerType::Pointer initializer = TransformInitializerType::New();<br>
<br>
        initializer-&gt;SetTransform(transform);<br>
<br>
        initializer-&gt;SetFixedImage(fixedImage);<br>
        initializer-&gt;SetMovingImage(movingImage);<br>
        initializer-&gt;GeometryOn();<br>
        initializer-&gt;InitializeTransform();<br>
<br>
<br>
        transform-&gt;SetAngle(0.0);<br>
<br>
        registration-&gt;SetInitialTransformParameters(transform-&gt;GetParameters());<br>
<br>
        //we want to register movingImage against fixedImage<br>
        registration-&gt;SetFixedImage(fixedImage);<br>
        registration-&gt;SetMovingImage(movingImage);<br>
<br>
        //we want to register the entire image<br>
        registration-&gt;SetFixedImageRegion(fixedImage-&gt;GetLargestPossibleRegion());<br>
<br>
        //now registration is ready<br>
        typedef OptimizerType::ScalesType OptimizerScalesType;<br>
        OptimizerScalesType optimizerScales(transform-&gt;GetNumberOfParameters());<br>
<br>
        const Image2DType::SpacingType fixedSpacing = fixedImage-&gt;GetSpacing();<br>
        const Image2DType::SizeType fixedSize = fixedImage-&gt;GetLargestPossibleRegion().GetSize();<br>
<br>
        const double translationScale = 1.0 / (fixedSize[0] * fixedSpacing[0] * sqrt(2.0));<br>
<br>
        optimizerScales[0] = 1.0;<br>
        optimizerScales[1] = translationScale;<br>
        optimizerScales[2] = translationScale;<br>
        optimizerScales[3] = translationScale;<br>
        optimizerScales[4] = translationScale;<br>
<br>
        optimizer-&gt;SetScales(optimizerScales);<br>
<br>
        GeneratorType::Pointer generator = GeneratorType::New();<br>
        generator-&gt;Initialize(12345);<br>
        optimizer-&gt;MaximizeOff();<br>
<br>
        optimizer-&gt;SetNormalVariateGenerator(generator);<br>
        optimizer-&gt;Initialize(10);<br>
        optimizer-&gt;SetEpsilon(1.0);<br>
        optimizer-&gt;SetMaximumIteration(400); //4000<br>
<br>
        //add observer pattern to monitor evolution of optimization / registration process<br>
        CommandIterationUpdate::Pointer observer = CommandIterationUpdate::New();<br>
        optimizer-&gt;AddObserver(itk::IterationEvent(), observer);<br>
<br>
        try<br>
        {<br>
                registration-&gt;StartRegistration();<br>
        }<br>
        catch(itk::ExceptionObject &amp; err)<br>
        {<br>
                std::cerr &lt;&lt; &quot;ExceptionObject caught !&quot; &lt;&lt; std::endl;<br>
                std::cerr &lt;&lt; err &lt;&lt; std::endl;<br>
                exit(EXIT_FAILURE);<br>
        }<br>
<br>
        // get the registration parameters<br>
        typedef RegistrationType::ParametersType ParametersType;<br>
        ParametersType finalParameters = registration-&gt;GetLastTransformParameters();<br>
<br>
        std::cout &lt;&lt; -finalParameters[0] * 180.0 / vnl_math::pi &lt;&lt; &quot; &quot; &lt;&lt; finalParameters[3] &lt;&lt; finalParameters[4] &lt;&lt; std::endl;<br>
        //final Output: 0 0 0 (same during entire process)<br>
}<br>
<br>
Thank you.<br>
--<br>
Jetzt kostenlos herunterladen: Internet Explorer 8 und Mozilla Firefox 3 -<br>
sicherer, schneller und einfacher! <a href="http://portal.gmx.net/de/go/chbrowser" target="_blank">http://portal.gmx.net/de/go/chbrowser</a><br>
_____________________________________<br>
Powered by <a href="http://www.kitware.com" target="_blank">www.kitware.com</a><br>
<br>
Visit other Kitware open-source projects at<br>
<a href="http://www.kitware.com/opensource/opensource.html" target="_blank">http://www.kitware.com/opensource/opensource.html</a><br>
<br>
Please keep messages on-topic and check the ITK FAQ at: <a href="http://www.itk.org/Wiki/ITK_FAQ" target="_blank">http://www.itk.org/Wiki/ITK_FAQ</a><br>
<br>
Follow this link to subscribe/unsubscribe:<br>
<a href="http://www.itk.org/mailman/listinfo/insight-users" target="_blank">http://www.itk.org/mailman/listinfo/insight-users</a><br>
</blockquote></div><br>