<html><head><style type="text/css"><!-- DIV {margin:0px;} --></style></head><body><div style="font-family:times new roman, new york, times, serif;font-size:12pt"><DIV>Hi Daniel, </DIV>
<DIV>I have a question. if Update&nbsp;should be called on the last filter in the pipeline why its called after each writer in this example ? I could n't see the purpose ?</DIV>
<DIV>Thanks</DIV>
<DIV>Martine</DIV>
<DIV><BR>&nbsp;</DIV>
<DIV style="FONT-SIZE: 12pt; FONT-FAMILY: times new roman, new york, times, serif"><BR>
<DIV style="FONT-SIZE: 13px; FONT-FAMILY: arial, helvetica, sans-serif">----- Message d'origine ----<BR>De : Daniel Mace &lt;dlm19@duke.edu&gt;<BR>À : Martine Lefevre &lt;martine_lef@yahoo.fr&gt;<BR>Cc : insight itk &lt;insight-users@itk.org&gt;<BR>Envoyé le : Lundi, 25 Août 2008, 5h59mn 56s<BR>Objet&nbsp;: Re: [Insight-users] meaning of Update() function? where exactly this function should be placed ?<BR><BR>Martine,<BR><BR>You should only need to call Update() on the last filter in the pipeline <BR>(in your case, the writers).&nbsp; As you noted, the Update() on the writer <BR>will trickle down and call Update on all the filters in the pipeline.&nbsp; <BR>It should also be called after you have set all the parameters for all <BR>the filters in the pipeline.&nbsp; In your case, you are calling <BR>writer4-&gt;Update() before you have set the parameters for your <BR>FastMarchingFilter (which might be why it keeps running).<BR><BR>The only time I've
 needed to call Update() on a filter that is not the <BR>last filter in the pipeline is to Update the reader if I need to get the <BR>size of the image prior to updating the pipeline (which, may or may not <BR>have been resolved by now).<BR><BR>Cheers,<BR>Dan<BR><BR><BR>Martine Lefevre wrote:<BR>&gt;<BR>&gt; Dear itk users,<BR>&gt;<BR>&gt; I’m new to itk (just in my first week). I have successfully configured <BR>&gt; itk and also vtk. I am now reading the ItkSoftwareGuide and I trying <BR>&gt; to run some of the examples provided. I’m little bit confused with the <BR>&gt; meaning of the Update function (for instance writer-&gt;Update(); ). <BR>&gt; According to the book update function triggers the execution of the <BR>&gt; pipeline. When I change its location in the code, the code still <BR>&gt; running without end. For example in the example <BR>&gt; FastMarchingImageFilter.c++&nbsp; if I move writer4-&gt;Update();and put it <BR>&gt; just after
 caster4-&gt;SetOutputMaximum( 255 ); ,as with the other <BR>&gt; writers, the code still running without end ! <BR>&gt;<BR>&gt; I couldn’t understand where exactly this function should be placed in <BR>&gt; a given code.<BR>&gt;<BR>&gt; Is it better to call this function with the last filter (i.e. a writer <BR>&gt; ) or I can call it after each filter (and even reader and writer) ? <BR>&gt;&nbsp; What’s the difference between both??<BR>&gt;<BR>&gt; Please could you answer me?<BR>&gt;<BR>&gt; Thank you<BR>&gt;<BR>&gt; Martine<BR>&gt;<BR>&gt; Please see the code:<BR>&gt;<BR>&gt;&nbsp; <BR>&gt;<BR>&gt; // The following example implements a fast marching solution to a <BR>&gt; simple level set evolution problem.<BR>&gt;<BR>&gt; #include "itkCurvatureAnisotropicDiffusionImageFilter.h"<BR>&gt;<BR>&gt; #include "itkGradientMagnitudeRecursiveGaussianImageFilter.h"<BR>&gt;<BR>&gt; #include "itkSigmoidImageFilter.h"<BR>&gt;<BR>&gt; #include
 "itkImage.h"<BR>&gt;<BR>&gt; #include "itkFastMarchingImageFilter.h"<BR>&gt;<BR>&gt; #include "itkBinaryThresholdImageFilter.h"<BR>&gt;<BR>&gt; #include "itkImageFileReader.h"<BR>&gt;<BR>&gt; #include "itkImageFileWriter.h"<BR>&gt;<BR>&gt; #include "itkRescaleIntensityImageFilter.h"<BR>&gt;<BR>&gt;&nbsp; <BR>&gt;<BR>&gt; int main( )<BR>&gt;<BR>&gt; {<BR>&gt;<BR>&gt; typedef float InternalPixelType;<BR>&gt;<BR>&gt; const unsigned int Dimension = 2;<BR>&gt;<BR>&gt; typedef itk::Image&lt; InternalPixelType, Dimension &gt; InternalImageType;<BR>&gt;<BR>&gt; typedef unsigned char OutputPixelType;<BR>&gt;<BR>&gt; typedef itk::Image&lt; OutputPixelType, Dimension &gt; OutputImageType;<BR>&gt;<BR>&gt; typedef itk::BinaryThresholdImageFilter&lt; InternalImageType, <BR>&gt; OutputImageType &gt; ThresholdingFilterType;<BR>&gt;<BR>&gt; ThresholdingFilterType::Pointer thresholder = <BR>&gt; ThresholdingFilterType::New();<BR>&gt;<BR>&gt; const InternalPixelType
 timeThreshold = atof( "100" );<BR>&gt;<BR>&gt; thresholder-&gt;SetLowerThreshold( 0.0 );<BR>&gt;<BR>&gt; thresholder-&gt;SetUpperThreshold( timeThreshold );<BR>&gt;<BR>&gt; thresholder-&gt;SetOutsideValue( 0 );<BR>&gt;<BR>&gt; thresholder-&gt;SetInsideValue( 255 );<BR>&gt;<BR>&gt; typedef itk::ImageFileReader&lt; InternalImageType &gt; ReaderType;<BR>&gt;<BR>&gt; typedef itk::ImageFileWriter&lt; OutputImageType &gt; WriterType;<BR>&gt;<BR>&gt; ReaderType::Pointer reader = ReaderType::New();<BR>&gt;<BR>&gt; WriterType::Pointer writer = WriterType::New();<BR>&gt;<BR>&gt; reader-&gt;SetFileName("d:/BrainProtonDensitySlice.png");<BR>&gt;<BR>&gt; writer-&gt;SetFileName("d:/FastMarchingSegmentedImg.png");<BR>&gt;<BR>&gt; typedef itk::RescaleIntensityImageFilter&lt; InternalImageType, <BR>&gt; OutputImageType &gt; CastFilterType;<BR>&gt;<BR>&gt; typedef itk::CurvatureAnisotropicDiffusionImageFilter&lt; <BR>&gt; InternalImageType, InternalImageType &gt;
 SmoothingFilterType;<BR>&gt;<BR>&gt; SmoothingFilterType::Pointer smoothing = SmoothingFilterType::New();<BR>&gt;<BR>&gt; typedef itk::GradientMagnitudeRecursiveGaussianImageFilter&lt; <BR>&gt; InternalImageType, InternalImageType &gt; GradientFilterType;<BR>&gt;<BR>&gt; typedef itk::SigmoidImageFilter&lt; InternalImageType, InternalImageType <BR>&gt; &gt; SigmoidFilterType;<BR>&gt;<BR>&gt; GradientFilterType::Pointer gradientMagnitude = GradientFilterType::New();<BR>&gt;<BR>&gt; SigmoidFilterType::Pointer sigmoid = SigmoidFilterType::New();<BR>&gt;<BR>&gt; sigmoid-&gt;SetOutputMinimum( 0.0 );<BR>&gt;<BR>&gt; sigmoid-&gt;SetOutputMaximum( 1.0 );<BR>&gt;<BR>&gt; typedef itk::FastMarchingImageFilter&lt; InternalImageType, <BR>&gt; InternalImageType &gt; FastMarchingFilterType;<BR>&gt;<BR>&gt; FastMarchingFilterType::Pointer fastMarching = <BR>&gt; FastMarchingFilterType::New();<BR>&gt;<BR>&gt; smoothing-&gt;SetInput( reader-&gt;GetOutput()
 );<BR>&gt;<BR>&gt; gradientMagnitude-&gt;SetInput( smoothing-&gt;GetOutput() );<BR>&gt;<BR>&gt; sigmoid-&gt;SetInput( gradientMagnitude-&gt;GetOutput() );<BR>&gt;<BR>&gt; fastMarching-&gt;SetInput( sigmoid-&gt;GetOutput() );<BR>&gt;<BR>&gt; thresholder-&gt;SetInput( fastMarching-&gt;GetOutput() );<BR>&gt;<BR>&gt; writer-&gt;SetInput( thresholder-&gt;GetOutput() );<BR>&gt;<BR>&gt; smoothing-&gt;SetTimeStep( 0.125 );<BR>&gt;<BR>&gt; smoothing-&gt;SetNumberOfIterations( 5 );<BR>&gt;<BR>&gt; smoothing-&gt;SetConductanceParameter( 9.0 );<BR>&gt;<BR>&gt; const double sigma = atof( "1.0" );<BR>&gt;<BR>&gt; gradientMagnitude-&gt;SetSigma( sigma );<BR>&gt;<BR>&gt; const double alpha = atof( "-0.5" );<BR>&gt;<BR>&gt; const double beta = atof( "3.0" );<BR>&gt;<BR>&gt;&nbsp; <BR>&gt;<BR>&gt; sigmoid-&gt;SetAlpha( alpha );<BR>&gt;<BR>&gt; sigmoid-&gt;SetBeta( beta );<BR>&gt;<BR>&gt; typedef FastMarchingFilterType::NodeContainer NodeContainer;<BR>&gt;<BR>&gt; typedef
 FastMarchingFilterType::NodeType NodeType;<BR>&gt;<BR>&gt; NodeContainer::Pointer seeds = NodeContainer::New();<BR>&gt;<BR>&gt; InternalImageType::IndexType seedPosition;<BR>&gt;<BR>&gt; seedPosition[0] = atoi( "81" );<BR>&gt;<BR>&gt; seedPosition[1] = atoi( "114" );<BR>&gt;<BR>&gt; NodeType node;<BR>&gt;<BR>&gt; const double seedValue = 0.0;<BR>&gt;<BR>&gt; node.SetValue( seedValue );<BR>&gt;<BR>&gt; node.SetIndex( seedPosition );<BR>&gt;<BR>&gt; seeds-&gt;Initialize();<BR>&gt;<BR>&gt; seeds-&gt;InsertElement( 0, node );<BR>&gt;<BR>&gt; fastMarching-&gt;SetTrialPoints( seeds );<BR>&gt;<BR>&gt; CastFilterType::Pointer caster1 = CastFilterType::New();<BR>&gt;<BR>&gt; CastFilterType::Pointer caster2 = CastFilterType::New();<BR>&gt;<BR>&gt; CastFilterType::Pointer caster3 = CastFilterType::New();<BR>&gt;<BR>&gt; CastFilterType::Pointer caster4 = CastFilterType::New();<BR>&gt;<BR>&gt; WriterType::Pointer writer1 = WriterType::New();<BR>&gt;<BR>&gt;
 WriterType::Pointer writer2 = WriterType::New();<BR>&gt;<BR>&gt; WriterType::Pointer writer3 = WriterType::New();<BR>&gt;<BR>&gt; WriterType::Pointer writer4 = WriterType::New();<BR>&gt;<BR>&gt; caster1-&gt;SetInput( smoothing-&gt;GetOutput() );<BR>&gt;<BR>&gt; writer1-&gt;SetInput( caster1-&gt;GetOutput() );<BR>&gt;<BR>&gt; writer1-&gt;SetFileName("d:/FastMarchingFilterOutput1.png");<BR>&gt;<BR>&gt; caster1-&gt;SetOutputMinimum( 0 );<BR>&gt;<BR>&gt; caster1-&gt;SetOutputMaximum( 255 );<BR>&gt;<BR>&gt; writer1-&gt;Update();<BR>&gt;<BR>&gt; caster2-&gt;SetInput( gradientMagnitude-&gt;GetOutput() );<BR>&gt;<BR>&gt; writer2-&gt;SetInput( caster2-&gt;GetOutput() );<BR>&gt;<BR>&gt; writer2-&gt;SetFileName("d:/FastMarchingFilterOutput2.png");<BR>&gt;<BR>&gt; caster2-&gt;SetOutputMinimum( 0 );<BR>&gt;<BR>&gt; caster2-&gt;SetOutputMaximum( 255 );<BR>&gt;<BR>&gt; writer2-&gt;Update();<BR>&gt;<BR>&gt; caster3-&gt;SetInput( sigmoid-&gt;GetOutput()
 );<BR>&gt;<BR>&gt; writer3-&gt;SetInput( caster3-&gt;GetOutput() );<BR>&gt;<BR>&gt; writer3-&gt;SetFileName("d:/FastMarchingFilterOutput3.png");<BR>&gt;<BR>&gt; caster3-&gt;SetOutputMinimum( 0 );<BR>&gt;<BR>&gt; caster3-&gt;SetOutputMaximum( 255 );<BR>&gt;<BR>&gt; writer3-&gt;Update();<BR>&gt;<BR>&gt; caster4-&gt;SetInput( fastMarching-&gt;GetOutput() );<BR>&gt;<BR>&gt; writer4-&gt;SetInput( caster4-&gt;GetOutput() );<BR>&gt;<BR>&gt; writer4-&gt;SetFileName("d:/FastMarchingFilterOutput4.png");<BR>&gt;<BR>&gt; caster4-&gt;SetOutputMinimum( 0 );<BR>&gt;<BR>&gt; caster4-&gt;SetOutputMaximum( 255 );<BR>&gt;<BR>&gt; writer4-&gt;Update(); // here where I have moved writer4-&gt;Update();<BR>&gt;<BR>&gt; fastMarching-&gt;SetOutputSize( <BR>&gt; reader-&gt;GetOutput()-&gt;GetBufferedRegion().GetSize() );<BR>&gt;<BR>&gt; const double stoppingTime = atof( "100" );<BR>&gt;<BR>&gt; fastMarching-&gt;SetStoppingValue( stoppingTime );<BR>&gt;<BR>&gt;
 try<BR>&gt;<BR>&gt; {<BR>&gt;<BR>&gt; writer-&gt;Update();<BR>&gt;<BR>&gt; }<BR>&gt;<BR>&gt; catch( itk::ExceptionObject &amp; excep )<BR>&gt;<BR>&gt; {<BR>&gt;<BR>&gt; std::cerr &lt;&lt; "Exception caught !" &lt;&lt; std::endl;<BR>&gt;<BR>&gt; std::cerr &lt;&lt; excep &lt;&lt; std::endl;<BR>&gt;<BR>&gt; }<BR>&gt;<BR>&gt; //writer4-&gt;Update();<BR>&gt;<BR>&gt; typedef itk::ImageFileWriter&lt; InternalImageType &gt; InternalWriterType;<BR>&gt;<BR>&gt; InternalWriterType::Pointer mapWriter = InternalWriterType::New();<BR>&gt;<BR>&gt; mapWriter-&gt;SetInput( fastMarching-&gt;GetOutput() );<BR>&gt;<BR>&gt; mapWriter-&gt;SetFileName("d:/FastMarchingFilterOutput4.mha");<BR>&gt;<BR>&gt; mapWriter-&gt;Update();<BR>&gt;<BR>&gt; InternalWriterType::Pointer speedWriter = InternalWriterType::New();<BR>&gt;<BR>&gt; speedWriter-&gt;SetInput( sigmoid-&gt;GetOutput() );<BR>&gt;<BR>&gt; speedWriter-&gt;SetFileName("d:/FastMarchingFilterOutput3.mha");<BR>&gt;<BR>&gt;
 speedWriter-&gt;Update();<BR>&gt;<BR>&gt; InternalWriterType::Pointer gradientWriter = InternalWriterType::New();<BR>&gt;<BR>&gt; gradientWriter-&gt;SetInput( gradientMagnitude-&gt;GetOutput() );<BR>&gt;<BR>&gt; gradientWriter-&gt;SetFileName("d:/FastMarchingFilterOutput2.mha");<BR>&gt;<BR>&gt; gradientWriter-&gt;Update();<BR>&gt;<BR>&gt; std::cout &lt;&lt; "Code end !" &lt;&lt; std::endl;<BR>&gt;<BR>&gt; std::cin.get();<BR>&gt;<BR>&gt; return 0;<BR>&gt;<BR>&gt; }<BR>&gt;<BR>&gt;<BR>&gt;<BR>&gt; ------------------------------------------------------------------------<BR>&gt; Envoyé avec Yahoo! Mail <BR>&gt; &lt;<A href="http://us.rd.yahoo.com/mailuk/taglines/isp/control/*http://us.rd.yahoo.com/evt=52423/*http://fr.docs.yahoo.com/mail/overview/index.html" target=_blank>http://us.rd.yahoo.com/mailuk/taglines/isp/control/*http://us.rd.yahoo.com/evt=52423/*http://fr.docs.yahoo.com/mail/overview/index.html</A>&gt;.<BR>&gt; Une boite mail plus
 intelligente.<BR>&gt; ------------------------------------------------------------------------<BR>&gt;<BR>&gt; _______________________________________________<BR>&gt; Insight-users mailing list<BR>&gt; <A href="mailto:Insight-users@itk.org" ymailto="mailto:Insight-users@itk.org">Insight-users@itk.org</A><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;&nbsp; <BR><BR></DIV></DIV></div><br>


      <hr size="1"> 
Envoyé avec <a href="http://us.rd.yahoo.com/mailuk/taglines/isp/control/*http://us.rd.yahoo.com/evt=52423/*http://fr.docs.yahoo.com/mail/overview/index.html">Yahoo! Mail</a>.<br>Une boite mail plus intelligente. </a></body></html>