Hi J.X.J <br><br><br>You could do something like the following:<br><br><br><br>class CommandIterationUpdate : public itk::Command <br>{<br>public:<br>  typedef  CommandIterationUpdate   Self;<br>  typedef  itk::Command             Superclass;<br>
  typedef itk::SmartPointer&lt;Self&gt;   Pointer;<br>  itkNewMacro( Self );<br>protected:<br>  CommandIterationUpdate() {};<br>public:<br>  typedef itk::LevenbergMarquardtOptimizer     OptimizerType<br>  typedef   const OptimizerType *              OptimizerPointer;<br>
<br>  void Open( const char * filename )<br>    {<br>    m_Output.open( filename );<br>    }<br>  void Close()<br>   {<br>   m_Output.close();<br>   }<br>  void Execute(itk::Object *caller, const itk::EventObject &amp; event)<br>
    {<br>    Execute( (const itk::Object *)caller, event);<br>    }<br><br>  void Execute(const itk::Object * object, const itk::EventObject &amp; event)<br>    {<br>    OptimizerPointer optimizer = <br>      dynamic_cast&lt; OptimizerPointer &gt;( object );<br>
    if( ! itk::IterationEvent().CheckEvent( &amp;event ) )<br>      {<br>      return;<br>      }<br>    m_Output &lt;&lt; optimizer-&gt;GetCurrentIteration() &lt;&lt; &quot;   &quot;;<br>    m_Output &lt;&lt; optimizer-&gt;GetCachedValue() &lt;&lt; &quot;   &quot;;<br>
    m_Output &lt;&lt; optimizer-&gt;GetCurrentPosition() &lt;&lt; std::endl;<br>    }<br>private:<br>    std::ofstream     m_Output;<br>};<br><br>Then you connect it to the optimizer as:<br><br><br>  CommandIterationUpdate::Pointer observer = CommandIterationUpdate::New();<br>
  optimizer-&gt;AddObserver( itk::IterationEvent(), observer );<br>  observer-&gt;Open( &quot;myOutputFile.txt&quot;);<br>  registration-&gt;StartRegistration();<br>  observer-&gt;Close();<br><br><br>Note that the actual methods to call will have to match the API <br>
of the optimizer that you are using.<br><br><br>About the compilation error... please post the source code<br>of your test.  You seem to be mixing two incompatible types.<br><br><br><br>     Regards,<br><br><br>           Luis<br>
<br><br>------------------------------------------------------<br><div class="gmail_quote">On Sun, Aug 9, 2009 at 5:17 AM, J.X.J. <span dir="ltr">&lt;<a href="mailto:wat.a.phony@gmail.com">wat.a.phony@gmail.com</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;"><br>
Hi Luis,<br>
<br>
How can I store the metric value of each iteration into a file or<br>
variable/array within the observer? I&#39;ve tried using ofstream to output the<br>
metric into a text file but it only stores the final metric value<br>
(optimizer-&gt;GetMetric()) after the registration-&gt;update() is finished. I&#39;ve<br>
tried introducing ofstream into the observer but I cannot use the following<br>
command inside the observer (if that makes sense).<br>
<br>
std::ofstream infile;<br>
infile.open(argv[4]);<br>
infile&lt;&lt;optimizer-&gt;GetMetric();<br>
infile.close;<br>
<br>
As for the Levenberg Marquardt Optimizer this is the whole error message<br>
when compiling.<br>
<br>
1&gt;BSpline_ITK_DICOMM.cxx<br>
1&gt;.\BSpline_ITK_DICOMM.cxx(242) : error C2664:<br>
<div class="im">&#39;itk::ImageRegistrationMethod&lt;TFixedImage,TMovingImage&gt;::SetOptimizer&#39; :<br>
cannot convert parameter 1 from &#39;itk::LevenbergMarquardtOptimizer::Pointer&#39;<br>
to &#39;itk::ImageRegistrationMethod&lt;TFixedImage,TMovingImage&gt;::OptimizerType *&#39;<br>
</div>1&gt;        with<br>
1&gt;        [<br>
1&gt;            TFixedImage=InternalImageType,<br>
1&gt;            TMovingImage=InternalImageType<br>
1&gt;        ]<br>
1&gt;        No user-defined-conversion operator available that can perform<br>
this conversion, or the operator cannot be called<br>
1&gt;.\BSpline_ITK_DICOMM.cxx(366) : error C2039: &#39;GetCurrentIteration&#39; : is<br>
not a member of &#39;itk::LevenbergMarquardtOptimizer&#39;<br>
1&gt;        D:\University -<br>
Engineering\Project\InsightToolkit-3.12.0\Code\Numerics\itkLevenbergMarquardtOptimizer.h(31)<br>
: see declaration of &#39;itk::LevenbergMarquardtOptimizer&#39;<br>
1&gt;.\BSpline_ITK_DICOMM.cxx(367) : error C2440: &#39;initializing&#39; : cannot<br>
convert from &#39;itk::MultipleValuedNonLinearOptimizer::MeasureType&#39; to<br>
&#39;double&#39;<br>
1&gt;        No user-defined-conversion operator available that can perform<br>
this conversion, or the operator cannot be called<br>
<div><div></div><div class="h5"><br>
J.X.J.<br>
<br>
<br>
Luis Ibanez wrote:<br>
&gt;<br>
&gt; Hi J.X.J.<br>
&gt;<br>
&gt; If the Metric is oscillating, this may be a symptom that your optimizer<br>
&gt; is taking jumps that are too large.<br>
&gt;<br>
&gt; I usually plot the metric values by using GNUPlot, but you could do the<br>
&gt; same with the spreadsheet of OpenOffice, or even with Excel.<br>
&gt;<br>
&gt; ---<br>
&gt;<br>
&gt; About the compilation error,  please post also the sentence that<br>
&gt; follows the one that you posted. The next sentence to that one<br>
&gt; tells what the problem is.<br>
&gt;<br>
&gt;<br>
&gt;      Thanks<br>
&gt;<br>
&gt;<br>
&gt;             Luis<br>
&gt;<br>
&gt;<br>
&gt; ----------------------<br>
&gt; On Sat, Aug 8, 2009 at 7:45 PM, J.X.J. &lt;<a href="mailto:wat.a.phony@gmail.com">wat.a.phony@gmail.com</a>&gt; wrote:<br>
&gt;<br>
&gt;&gt;<br>
&gt;&gt; Hi Luis,<br>
&gt;&gt;<br>
&gt;&gt; thanks for your reply. I have added an observe to the code, the metric<br>
&gt;&gt; value<br>
&gt;&gt; output seems to oscillate rather than a general increase for decrease in<br>
&gt;&gt; value. How do you plot the metric values? Is there a way to output the<br>
&gt;&gt; metric value of each iteration into a text or similar file and I could<br>
&gt;&gt; use<br>
&gt;&gt; MATLAB to plot it, or is there a way to do that directly from ITK?<br>
&gt;&gt;<br>
&gt;&gt; Also I&#39;ve noticed that using Viola and Wells MI is REALLY slow when<br>
&gt;&gt; coupled<br>
&gt;&gt; with BSpline Deformable Transform. I&#39;ve tried using Mattes MI which is<br>
&gt;&gt; much<br>
&gt;&gt; much faster in comparison in the order of 5-10 fold, why is that the<br>
&gt;&gt; case?<br>
&gt;&gt;<br>
&gt;&gt; And finally (I&#39;m sorry for all the questions, programming in C is not my<br>
&gt;&gt; forte), I tried using Levenberg Marquardt Optimizer but I get this error<br>
&gt;&gt; but<br>
&gt;&gt; I compile the code: error C2664:<br>
&gt;&gt; &#39;itk::ImageRegistrationMethod&lt;TFixedImage,TMovingImage&gt;::SetOptimizer&#39; :<br>
&gt;&gt; cannot convert parameter 1 from<br>
&gt;&gt; &#39;itk::LevenbergMarquardtOptimizer::Pointer&#39;<br>
&gt;&gt; to &#39;itk::ImageRegistrationMethod&lt;TFixedImage,TMovingImage&gt;::OptimizerType<br>
&gt;&gt; *&#39;<br>
&gt;&gt;<br>
&gt;&gt; Any help is appreciated<br>
&gt;&gt; J.X.J.<br>
&gt;&gt;<br>
&gt;&gt;<br>
&gt;&gt; Luis Ibanez wrote:<br>
&gt;&gt; &gt;<br>
&gt;&gt; &gt; Hi J.X.J.<br>
&gt;&gt; &gt;<br>
&gt;&gt; &gt; The first thing that you want to do is to instantiate a<br>
&gt;&gt; Command/Observer<br>
&gt;&gt; &gt; and to print out the values of the Metric at every iteration of the<br>
&gt;&gt; &gt; optimizer.<br>
&gt;&gt; &gt;<br>
&gt;&gt; &gt; Plot this values and/or send the output to the mailing list.<br>
&gt;&gt; &gt;<br>
&gt;&gt; &gt; From the progression of the metric values it will be possible to<br>
&gt;&gt; determine<br>
&gt;&gt; &gt; if parameters of the optimizer need to be adjusted, or whether you may<br>
&gt;&gt; &gt; have to review other components of your registration structure.<br>
&gt;&gt; &gt;<br>
&gt;&gt; &gt; You will find examples on how to use Command Observers in almost<br>
&gt;&gt; &gt; all the files in the directory:<br>
&gt;&gt; &gt;<br>
&gt;&gt; &gt;                     Insight/Examples/Registration<br>
&gt;&gt; &gt;<br>
&gt;&gt; &gt;<br>
&gt;&gt; &gt;     Regards,<br>
&gt;&gt; &gt;<br>
&gt;&gt; &gt;<br>
&gt;&gt; &gt;           Luis<br>
&gt;&gt; &gt;<br>
&gt;&gt; &gt;<br>
&gt;&gt; &gt; --------------------------------------------------------------------<br>
&gt;&gt; &gt; On Sat, Aug 1, 2009 at 6:49 AM, J.X.J. &lt;<a href="mailto:wat.a.phony@gmail.com">wat.a.phony@gmail.com</a>&gt; wrote:<br>
&gt;&gt; &gt;<br>
&gt;&gt; &gt;&gt;<br>
&gt;&gt; &gt;&gt; Hi everyone,<br>
&gt;&gt; &gt;&gt;<br>
&gt;&gt; &gt;&gt; I&#39;m current using itk::BSplineDeformableTransform,<br>
&gt;&gt; &gt;&gt; itk::MutualInformationImageToImageMetric and<br>
&gt;&gt; &gt;&gt; itk::GradientDescentOptimizer<br>
&gt;&gt; &gt;&gt; to register 2D MRI images. My problem is that when running 2 phantom<br>
&gt;&gt; &gt;&gt; images<br>
&gt;&gt; &gt;&gt; the output image is almost exactly the same as the original moving<br>
&gt;&gt; image<br>
&gt;&gt; &gt;&gt; (nothing like the fixed image).<br>
&gt;&gt; &gt;&gt;<br>
&gt;&gt; &gt;&gt; I have normalized and smoothed the 2 input images using<br>
&gt;&gt; &gt;&gt; itk::NormalizeImageFilter and itk::DiscreteGaussianImageFilter with<br>
&gt;&gt; &gt;&gt; SetVariance(2.0). For mutual information the standard deviation is<br>
&gt;&gt; 0.4.<br>
&gt;&gt; &gt;&gt; Optimizer learning rate is 10.0, 200 iteration and with maximum on.<br>
&gt;&gt; This<br>
&gt;&gt; &gt;&gt; set<br>
&gt;&gt; &gt;&gt; up is kind of a mixture of a number of deformableregistration examples<br>
&gt;&gt; on<br>
&gt;&gt; &gt;&gt; default (as in I copied and pasted all parameter settings etc<br>
&gt;&gt; directly).<br>
&gt;&gt; &gt;&gt;<br>
&gt;&gt; &gt;&gt; Does anyone know what the problem could be? The code runs all 200<br>
&gt;&gt; &gt;&gt; iterations<br>
&gt;&gt; &gt;&gt; is thats an indication, also the metric value of each iteration is<br>
&gt;&gt; around<br>
&gt;&gt; &gt;&gt; 0.2 - 0.4 if that&#39;s any help.<br>
&gt;&gt; &gt;&gt;<br>
&gt;&gt; &gt;&gt; J.X.J.<br>
&gt;&gt; &gt;&gt; --<br>
&gt;&gt; &gt;&gt; View this message in context:<br>
&gt;&gt; &gt;&gt;<br>
&gt;&gt; <a href="http://www.nabble.com/Helo-with-bspline-mutual-information-gradient-descent-tp24768056p24768056.html" target="_blank">http://www.nabble.com/Helo-with-bspline-mutual-information-gradient-descent-tp24768056p24768056.html</a><br>

&gt;&gt; &gt;&gt; Sent from the ITK - Users mailing list archive at Nabble.com.<br>
&gt;&gt; &gt;&gt;<br>
&gt;&gt; &gt;&gt; _____________________________________<br>
&gt;&gt; &gt;&gt; Powered by <a href="http://www.kitware.com" target="_blank">www.kitware.com</a><br>
&gt;&gt; &gt;&gt;<br>
&gt;&gt; &gt;&gt; Visit other Kitware open-source projects at<br>
&gt;&gt; &gt;&gt; <a href="http://www.kitware.com/opensource/opensource.html" target="_blank">http://www.kitware.com/opensource/opensource.html</a><br>
&gt;&gt; &gt;&gt;<br>
&gt;&gt; &gt;&gt; Please keep messages on-topic and check the ITK FAQ at:<br>
&gt;&gt; &gt;&gt; <a href="http://www.itk.org/Wiki/ITK_FAQ" target="_blank">http://www.itk.org/Wiki/ITK_FAQ</a><br>
&gt;&gt; &gt;&gt;<br>
&gt;&gt; &gt;&gt; Follow this link to subscribe/unsubscribe:<br>
&gt;&gt; &gt;&gt; <a href="http://www.itk.org/mailman/listinfo/insight-users" target="_blank">http://www.itk.org/mailman/listinfo/insight-users</a><br>
&gt;&gt; &gt;&gt;<br>
&gt;&gt; &gt;<br>
&gt;&gt; &gt; _____________________________________<br>
&gt;&gt; &gt; Powered by <a href="http://www.kitware.com" target="_blank">www.kitware.com</a><br>
&gt;&gt; &gt;<br>
&gt;&gt; &gt; Visit other Kitware open-source projects at<br>
&gt;&gt; &gt; <a href="http://www.kitware.com/opensource/opensource.html" target="_blank">http://www.kitware.com/opensource/opensource.html</a><br>
&gt;&gt; &gt;<br>
&gt;&gt; &gt; Please keep messages on-topic and check the ITK FAQ at:<br>
&gt;&gt; &gt; <a href="http://www.itk.org/Wiki/ITK_FAQ" target="_blank">http://www.itk.org/Wiki/ITK_FAQ</a><br>
&gt;&gt; &gt;<br>
&gt;&gt; &gt; Follow this link to subscribe/unsubscribe:<br>
&gt;&gt; &gt; <a href="http://www.itk.org/mailman/listinfo/insight-users" target="_blank">http://www.itk.org/mailman/listinfo/insight-users</a><br>
&gt;&gt; &gt;<br>
&gt;&gt; &gt;<br>
&gt;&gt;<br>
&gt;&gt; --<br>
&gt;&gt; View this message in context:<br>
&gt;&gt; <a href="http://www.nabble.com/Helo-with-bspline-mutual-information-gradient-descent-tp24768056p24883109.html" target="_blank">http://www.nabble.com/Helo-with-bspline-mutual-information-gradient-descent-tp24768056p24883109.html</a><br>

&gt;&gt; Sent from the ITK - Users mailing list archive at Nabble.com.<br>
&gt;&gt;<br>
&gt;&gt; _____________________________________<br>
&gt;&gt; Powered by <a href="http://www.kitware.com" target="_blank">www.kitware.com</a><br>
&gt;&gt;<br>
&gt;&gt; Visit other Kitware open-source projects at<br>
&gt;&gt; <a href="http://www.kitware.com/opensource/opensource.html" target="_blank">http://www.kitware.com/opensource/opensource.html</a><br>
&gt;&gt;<br>
&gt;&gt; Please keep messages on-topic and check the ITK FAQ at:<br>
&gt;&gt; <a href="http://www.itk.org/Wiki/ITK_FAQ" target="_blank">http://www.itk.org/Wiki/ITK_FAQ</a><br>
&gt;&gt;<br>
&gt;&gt; Follow this link to subscribe/unsubscribe:<br>
&gt;&gt; <a href="http://www.itk.org/mailman/listinfo/insight-users" target="_blank">http://www.itk.org/mailman/listinfo/insight-users</a><br>
&gt;&gt;<br>
&gt;<br>
&gt; _____________________________________<br>
&gt; Powered by <a href="http://www.kitware.com" target="_blank">www.kitware.com</a><br>
&gt;<br>
&gt; Visit other Kitware open-source projects at<br>
&gt; <a href="http://www.kitware.com/opensource/opensource.html" target="_blank">http://www.kitware.com/opensource/opensource.html</a><br>
&gt;<br>
&gt; Please keep messages on-topic and check the ITK FAQ at:<br>
&gt; <a href="http://www.itk.org/Wiki/ITK_FAQ" target="_blank">http://www.itk.org/Wiki/ITK_FAQ</a><br>
&gt;<br>
&gt; Follow this link to subscribe/unsubscribe:<br>
&gt; <a href="http://www.itk.org/mailman/listinfo/insight-users" target="_blank">http://www.itk.org/mailman/listinfo/insight-users</a><br>
&gt;<br>
&gt;<br>
<br>
--<br>
</div></div>View this message in context: <a href="http://www.nabble.com/Helo-with-bspline-mutual-information-gradient-descent-tp24768056p24885406.html" target="_blank">http://www.nabble.com/Helo-with-bspline-mutual-information-gradient-descent-tp24768056p24885406.html</a><br>

<div><div></div><div class="h5">Sent from the ITK - Users mailing list archive at Nabble.com.<br>
<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>
</div></div></blockquote></div><br>