Hi Dan,<br>Thanks for your offer to help.<br><br>I got past my previous point where nothing was happening.<br>Now I realized it is probably a combination between my<br>speed function and the FastMarchingImageFilter implementation.<br>

<br>Background: I had this application in matlab working very well.<br>The FastMarching was actually a toolbox contributed by Gabriel Peyre&#39;<br>whose engine is in C (perform_front_propagation_3d)<br>That works with a speed image made from the original subimage<br>

rescaled to [0,1] with 1 being fastest.<br>(no gradient pre-computed).<br><br>If I use the same with itk FM, it won&#39;t work. The arrival values at the<br>start point+1 would be infinity.<br><br>If I take my subimage (which is a crop out of the original)<br>

and use the magnitudegradient filter, itk FM works paritially;i.e.,<br>some cases result in a reasonable arrival and path, others do not.<br><br>In all cases so far, the matlab implementation seems to result in better<br>
paths. <br><br>If you can take a look, please visit <br><a href="http://www.rpi.edu/~sharah/testimages/">http://www.rpi.edu/~sharah/testimages/</a><br>You will find 1 working example (*1_1_*)<br>and another failing (*6_1_*)<br>
<br>each has a subregion image, <br>
with an rgb max projection with the start point in red <br>and some endpoints in green (currently I use<br>only one endpoint for now).<br><br>The speed function is the one generated by<br>GradientMagnitudeRecursiveGaussianImageFilter<br>
<div id=":15u" class="ii gt">
with sigma=2. (also the results are sensitive<br>to this sigma because the flow region is very thin.)<br><br>The arrival image and paths are extracted using your <br>filter.<br><br>I would like to know your perspective on this and whether you <br>
can suggest a better speed function generator given the tiny size<br>
of this application.<br><br>I will be testing other gradient options and perhaps will port<br>Peyre&#39;s implementation over to see how that arrival function works<br>with your path extraction pipeline.<br><br>Thanks.<br>
Hussein</div><br><br><div class="gmail_quote"><br><blockquote class="gmail_quote" style="border-left: 1px solid rgb(204, 204, 204); margin: 0pt 0pt 0pt 0.8ex; padding-left: 1ex;"><div><div class="h5"><br><br><br><br><div class="gmail_quote">

On Mon, Jul 20, 2009 at 8:53 AM, Dan Mueller <span dir="ltr">&lt;<a href="mailto:dan.muel@gmail.com" target="_blank">dan.muel@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;">

Hi Hussein,<br>
<br>
I really need the image data as well. Please upload these somewhere<br>
and send the link via email.<br>
<br>
Regards, Dan<br>
<br>
2009/7/18 asamwm &lt;<a href="mailto:asamwm@gmail.com" target="_blank">asamwm@gmail.com</a>&gt;:<br>
<div><div></div><div>&gt; Hi Dan,<br>
&gt; Your code looks great.<br>
&gt; I have been trying hard to make it work but it<br>
&gt; has not got to the finish line yet.<br>
&gt;<br>
&gt; I am carving out small 3D regions for the speed<br>
&gt; function (on the range of 30x40x30 pixels).<br>
&gt;<br>
&gt; I map the speed pixels to a float range [0.0 - 1.0];<br>
&gt; and can verify that the start and end points (1 end point for now)<br>
&gt; are where they should be in the small image.<br>
&gt;<br>
&gt; Then I pass this to the filter. I added a function to your code<br>
&gt; to read the arrival function at the end :<br>
&gt; after calling pathFilter-&gt;Update()<br>
&gt; I do (InputImagePointer GetArrivalFunc(){return m_CurrentArrivalFunction;};<br>
&gt; )<br>
&gt; in itkSpeedFunctionToPathFilter.h<br>
&gt;<br>
&gt; This reveals the following statistics for Arrival:<br>
&gt; min=0; max=1.70141e+38, mean=4.26e+36 ...<br>
&gt; I also read the arrival time at the endpoint: 1431.25<br>
&gt; (reasonable, right?)<br>
&gt;<br>
&gt; (Even when I use a fake end point that is very close<br>
&gt; to the start point, the arrival value is 315.8...)<br>
&gt;<br>
&gt; yet, the path is always empty!<br>
&gt;<br>
&gt; I tried all 3 suggested optimizers, but the result is the same.<br>
&gt;<br>
&gt; Can you suggest anything?<br>
&gt; I am attaching my calling method in case you see anything obvious.<br>
&gt;<br>
&gt; Thanks for your help.<br>
&gt;<br>
&gt;<br>
&gt; #if defined(_MSC_VER)<br>
&gt; //Warning about: identifier was truncated to &#39;255&#39; characters in the debug<br>
&gt; information (MVC6.0 Debug)<br>
&gt; #pragma warning( disable : 4786 )<br>
&gt; #endif<br>
&gt;<br>
&gt; // General includes<br>
&gt; #include &lt;string&gt;<br>
&gt; #include &lt;iostream&gt;<br>
&gt;<br>
&gt; // ITK includes<br>
&gt; #include &quot;itkNumericTraits.h&quot;<br>
&gt; #include &quot;itkImage.h&quot;<br>
&gt; #include &quot;itkImageFileReader.h&quot;<br>
&gt; #include &quot;itkImageFileWriter.h&quot;<br>
&gt; #include &quot;itkPolyLineParametricPath.h&quot;<br>
&gt; #include &quot;itkNearestNeighborInterpolateImageFunction.h&quot;<br>
&gt; #include &quot;itkLinearInterpolateImageFunction.h&quot;<br>
&gt; #include &quot;itkArrivalFunctionToPathFilter.h&quot;<br>
&gt; #include &quot;itkSpeedFunctionToPathFilter.h&quot;<br>
&gt; #include &quot;itkPathIterator.h&quot;<br>
&gt; #include &quot;itkGradientDescentOptimizer.h&quot;<br>
&gt; #include &quot;itkRegularStepGradientDescentOptimizer.h&quot;<br>
&gt; #include &quot;itkIterateNeighborhoodOptimizer.h&quot;<br>
&gt; #include &quot;itkStatisticsImageFilter.h&quot;<br>
&gt;<br>
&gt; #include &quot;SpineRing.h&quot;<br>
&gt;<br>
&gt; PathType::Pointer SpCandidate::FMPath(SpeedImageType::Pointer speed,<br>
&gt; PointType start, PointSetContainerType::Pointer endptscont)<br>
&gt; {<br>
&gt;     //typedef float    PixelType;//speed<br>
&gt;     typedef    unsigned char OutputPixelType;<br>
&gt;     //typedef itk::Image&lt; PixelType, spr_SPIMGDIMENSION    &gt;<br>
&gt; ImageType;//speed<br>
&gt;     typedef    itk::Image&lt;    OutputPixelType, spr_SPIMGDIMENSION    &gt;<br>
&gt; OutputImageType;<br>
&gt;     //typedef itk::ImageFileReader&lt;    ImageType &gt;    ReaderType;<br>
&gt;     typedef    itk::ImageFileWriter&lt; OutputImageType &gt;    WriterType;<br>
&gt;     //typedef    itk::SpeedFunctionToPathFilter&lt;    SpineImageType,<br>
&gt; PathType &gt; PathFilterType;<br>
&gt;     typedef    itk::SpeedFunctionToPathFilter&lt;    SpeedImageType,<br>
&gt; PathType &gt; PathFilterType;<br>
&gt;     typedef    PathFilterType::CostFunctionType::CoordRepType<br>
&gt; CoordRepType;<br>
&gt;     typedef    itk::PathIterator&lt; OutputImageType,    PathType &gt;<br>
&gt; PathIteratorType;<br>
&gt;<br>
&gt;     char* OutputFilename = &quot;TestPath.tif&quot;;<br>
&gt;<br>
&gt;     speed-&gt;DisconnectPipeline();<br>
&gt;<br>
&gt;     // Create interpolator<br>
&gt;     typedef    itk::LinearInterpolateImageFunction&lt;SpeedImageType,<br>
&gt; CoordRepType&gt;<br>
&gt;         InterpolatorType;<br>
&gt;     InterpolatorType::Pointer interp =    InterpolatorType::New();<br>
&gt;<br>
&gt;     // Create cost function<br>
&gt;     PathFilterType::CostFunctionType::Pointer cost    =<br>
&gt;         PathFilterType::CostFunctionType::New();<br>
&gt;     cost-&gt;SetInterpolator( interp );<br>
&gt;<br>
&gt;     // Create optimizer<br>
&gt;     ///////////////////////////////////////////////////////////////<br>
&gt;     //typedef    itk::GradientDescentOptimizer OptimizerType;<br>
&gt;     //OptimizerType::Pointer    optimizer =    OptimizerType::New();<br>
&gt;     //optimizer-&gt;SetNumberOfIterations( 1000 );<br>
&gt;     //////////////////////////////////////////////////////////////<br>
&gt;<br>
&gt;     ///////////////////////////////////////////////////////////////////<br>
&gt;     //typedef itk::RegularStepGradientDescentOptimizer OptimizerType;<br>
&gt;     //OptimizerType::Pointer optimizer    = OptimizerType::New();<br>
&gt;     //optimizer-&gt;SetNumberOfIterations(    1000 );<br>
&gt;     //optimizer-&gt;SetMaximumStepLength( 0.5 );<br>
&gt;     //optimizer-&gt;SetMinimumStepLength( 0.1 );<br>
&gt;     //optimizer-&gt;SetRelaxationFactor( 0.5 );<br>
&gt;     ///////////////////////////////////////////////////////////////////<br>
&gt;<br>
&gt;     ///////////////////////////////////////////////////////////////////<br>
&gt;     // Create IterateNeighborhoodOptimizer<br>
&gt;      typedef itk::IterateNeighborhoodOptimizer OptimizerType;<br>
&gt;      OptimizerType::Pointer optimizer = OptimizerType::New();<br>
&gt;      optimizer-&gt;MinimizeOn( );<br>
&gt;      optimizer-&gt;FullyConnectedOn( );<br>
&gt;      OptimizerType::NeighborhoodSizeType nbrsize( 3 );<br>
&gt;      //float StepLengthFactor = .2;<br>
&gt;      for (unsigned int i=0; i&lt;3; i++)<br>
&gt;           nbrsize[i] = speed-&gt;GetSpacing()[i]; //* StepLengthFactor;<br>
&gt;      optimizer-&gt;SetNeighborhoodSize( nbrsize );<br>
&gt;<br>
&gt;     // Create path filter<br>
&gt;     PathFilterType::Pointer pathFilter    = PathFilterType::New();<br>
&gt;     pathFilter-&gt;SetInput( speed    );<br>
&gt;     pathFilter-&gt;SetCostFunction( cost );<br>
&gt;     pathFilter-&gt;SetOptimizer( optimizer    );<br>
&gt;     pathFilter-&gt;SetTerminationValue( 2.0 );<br>
&gt;<br>
&gt;     // Setup path points<br>
&gt;     PathFilterType::PointType pstart, pend;<br>
&gt;     pstart = start;<br>
&gt;<br>
&gt;     // Add path    information<br>
&gt;     PathFilterType::PathInfo info;<br>
&gt;     info.SetStartPoint(    pstart );<br>
&gt;<br>
&gt;     pathFilter-&gt;AddPathInfo( info );<br>
&gt;<br>
&gt;<br>
&gt;     PointSetType::PointsContainerIterator    pciter = endptscont-&gt;Begin();<br>
&gt;     PointType                                pt;<br>
&gt;     while (pciter != endptscont-&gt;End())<br>
&gt;     {<br>
&gt;         pt = pciter-&gt;Value();<br>
&gt;         //for    (int j=0; j&lt;spr_SPIMGDIMENSION;    j++)<br>
&gt;         //{<br>
&gt;     //    pend = pt;<br>
&gt;         //}<br>
&gt;         // just to test a very close end point!<br>
&gt;         for (int ii=0; ii&lt;3; ii++)<br>
&gt;             pend[ii]=pstart[ii]-5;<br>
&gt;<br>
&gt;         info.SetEndPoint( pend );<br>
&gt;         //////////////////////////////////<br>
&gt;         // Hussein  FIXME<br>
&gt;         // for now<br>
&gt;         break;<br>
&gt;         // need to  examine endpt arrivals.. for all endpts. Choose best.<br>
&gt;         /////////////////////////////////<br>
&gt;         pciter++;<br>
&gt;     }<br>
&gt;<br>
&gt;<br>
&gt;     // Compute the path<br>
&gt;     pathFilter-&gt;Update(    );<br>
&gt;     //////////////////////////////////////////////////////////<br>
&gt;     /////////////// DEBUG STUFF<br>
&gt;     SpeedImageType::Pointer Arrival = pathFilter-&gt;GetArrivalFunc();<br>
&gt;     typedef    itk::ImageFileWriter&lt; SpeedImageType &gt;    WriterType2;<br>
&gt;     WriterType2::Pointer writer2    = WriterType2::New();<br>
&gt;     writer2-&gt;SetFileName( &quot;Arrival.vtk&quot;    );<br>
&gt;     writer2-&gt;SetInput( Arrival );<br>
&gt;     writer2-&gt;Update();<br>
&gt;     typedef itk::StatisticsImageFilter&lt;SpeedImageType&gt;  StatisticsType;<br>
&gt;     StatisticsType::Pointer statistics = StatisticsType::New();<br>
&gt;     statistics-&gt;SetInput(Arrival );<br>
&gt;     statistics-&gt;Update();<br>
&gt;     float imin = statistics-&gt;GetMinimum();<br>
&gt;     float imax = statistics-&gt;GetMaximum();<br>
&gt;     float imean = statistics-&gt;GetMean();<br>
&gt;     float istd = statistics-&gt;GetSigma();<br>
&gt;<br>
&gt;     std::cout &lt;&lt; &quot;Input Image Statistics: min:&quot;&lt;&lt; imin &lt;&lt; &quot; max:&quot; &lt;&lt; imax &lt;&lt;<br>
&gt; &quot; mean:&quot;&lt;&lt; imean &lt;&lt; &quot; std:&quot; &lt;&lt; istd &lt;&lt; std::endl;<br>
&gt;     SpeedImageType::IndexType arrIndex;<br>
&gt;     for (int ii=0; ii&lt;3; ii++)<br>
&gt;         arrIndex[ii] = pend[ii];<br>
&gt;     std::cout &lt;&lt; &quot;End Arrival Val=&quot; &lt;&lt; Arrival-&gt;GetPixel(arrIndex) &lt;&lt;<br>
&gt; std::endl;<br>
&gt;     //itk::ImageRegionIterator&lt;SpeedImageType&gt; arrit(Arrival,<br>
&gt; Arrival-&gt;GetRequestedRegion());<br>
&gt;     //SpeedPixelType spdpxl;<br>
&gt;     //for ( arrit.GoToBegin(); !arrit.IsAtEnd(); ++arrit)<br>
&gt;     //{<br>
&gt;     //    std::cout &lt;&lt; arrit.Get(); //spregion = (spregion-m)/(M-m);  %0 to<br>
&gt; 1<br>
&gt;     //}<br>
&gt;     /////////// END DEBUG STUFF<br>
&gt;     //////////////////////////////////////////////////////////////<br>
&gt;         ///////////////<br>
&gt;     // Allocate    output image<br>
&gt;     OutputImageType::Pointer output = OutputImageType::New();<br>
&gt;     output-&gt;SetRegions(    speed-&gt;GetLargestPossibleRegion() );<br>
&gt;     output-&gt;SetSpacing(    speed-&gt;GetSpacing()    );<br>
&gt;     output-&gt;SetOrigin( speed-&gt;GetOrigin() );<br>
&gt;     output-&gt;Allocate( );<br>
&gt;     output-&gt;FillBuffer(    itk::NumericTraits&lt;OutputPixelType&gt;::Zero );<br>
&gt;<br>
&gt;     PathType::Pointer path;<br>
&gt;     // Rasterize path<br>
&gt;     for    (unsigned int i=0; i&lt;pathFilter-&gt;GetNumberOfOutputs(); i++)<br>
&gt;     {<br>
&gt;         // Get the path<br>
&gt;         path    = pathFilter-&gt;GetOutput( i );<br>
&gt;<br>
&gt;         // Check path is valid<br>
&gt;         if ( path-&gt;GetVertexList()-&gt;Size() == 0    )<br>
&gt;         {<br>
&gt;             std::cout &lt;&lt; &quot;WARNING: Path    &quot; &lt;&lt; (i+1) &lt;&lt; &quot;    contains no<br>
&gt; points!&quot; &lt;&lt;    std::endl;<br>
&gt;             continue;<br>
&gt;         }<br>
&gt;<br>
&gt;         // Iterate path    and    convert    to image<br>
&gt;         PathIteratorType it( output, path );<br>
&gt;         for    (it.GoToBegin(); !it.IsAtEnd();    ++it)<br>
&gt;         {<br>
&gt;             it.Set(    itk::NumericTraits&lt;OutputPixelType&gt;::max() );<br>
&gt;         }<br>
&gt;     }<br>
&gt;<br>
&gt;     // Write output<br>
&gt;     WriterType::Pointer writer    = WriterType::New();<br>
&gt;     writer-&gt;SetFileName( OutputFilename    );<br>
&gt;     writer-&gt;SetInput( output );<br>
&gt;     writer-&gt;Update();<br>
&gt;<br>
&gt;     return path;<br>
&gt; }<br>
&gt;<br>
&gt;<br>
&gt; On Fri, Jul 17, 2009 at 3:57 AM, Dan Mueller &lt;<a href="mailto:dan.muel@gmail.com" target="_blank">dan.muel@gmail.com</a>&gt; wrote:<br>
&gt;&gt;<br>
&gt;&gt; Hi Hussein,<br>
&gt;&gt;<br>
&gt;&gt; &gt; In the ArrivalFunctionToPathFilter  superclass, you had AddEndPoint,<br>
&gt;&gt; &gt; but in SpeedFunctionToPathFilter, it is invalidated with a warning!<br>
&gt;&gt; &gt; Why is that?<br>
&gt;&gt; &gt; In the current implementation, I would have to rerun the wave as many<br>
&gt;&gt; &gt; times as there are endpoints and choose the one with least geodesic<br>
&gt;&gt; &gt; distance.<br>
&gt;&gt; &gt; Or alternatively, set all those end points as way points and compare<br>
&gt;&gt; &gt; their<br>
&gt;&gt; &gt; geodesics, pick the least, and use it for the path.<br>
&gt;&gt;<br>
&gt;&gt; Indeed, SpeedFunctionToPathFilter allows only a single end point. This<br>
&gt;&gt; is because the filter performs the path extraction in sections (eg.<br>
&gt;&gt; start point to way point 1, way point 1 to way point 2, way point 2 to<br>
&gt;&gt; end point). I guess it could be extended in the manner you describe,<br>
&gt;&gt; but to date has not been. Feel free to make this extension and submit<br>
&gt;&gt; it to the Insight Journal!<br>
&gt;&gt;<br>
&gt;&gt; If your path consists of multiple start points and multiple end points<br>
&gt;&gt; (ie. no way/intermediate points but multiple candidate start points),<br>
&gt;&gt; then you should instead use the ArrivalFunctionToPathFilter. This<br>
&gt;&gt; filter expects as input an arrival function, which you can compute<br>
&gt;&gt; yourself using FastMarchingImageFilter with all of the start points as<br>
&gt;&gt; trial points. Then simply add the end points via AddPathEndPoint(..)<br>
&gt;&gt; and the extracted path will select the closest start point.<br>
&gt;&gt;<br>
&gt;&gt; HTH<br>
&gt;&gt;<br>
&gt;&gt; Cheers, Dan<br>
&gt;&gt;<br>
&gt;&gt; 2009/7/16 asamwm &lt;<a href="mailto:asamwm@gmail.com" target="_blank">asamwm@gmail.com</a>&gt;:<br>
&gt;&gt; &gt; Hi Dan,<br>
&gt;&gt; &gt; I am towards the end of connecting things together however, it looks<br>
&gt;&gt; &gt; like<br>
&gt;&gt; &gt; you only allow one end point at a time to be set for the path.<br>
&gt;&gt; &gt; Please correct me if I am wrong, I am assuming the wave starts at<br>
&gt;&gt; &gt; startpoint (0 geodesic distance) and ends at endpoint.<br>
&gt;&gt; &gt;<br>
&gt;&gt; &gt; In the ArrivalFunctionToPathFilter  superclass, you had AddEndPoint,<br>
&gt;&gt; &gt; but in SpeedFunctionToPathFilter, it is invalidated with a warning!<br>
&gt;&gt; &gt; Why is that?<br>
&gt;&gt; &gt; The reason I think it is needed is when you have multiple end<br>
&gt;&gt; &gt; point candidates and you want the wave to stop propagation when it<br>
&gt;&gt; &gt; reaches<br>
&gt;&gt; &gt; the first endpoint (that would be the fastest / closest geodesic pt.).<br>
&gt;&gt; &gt;<br>
&gt;&gt; &gt; In the current implementation, I would have to rerun the wave as many<br>
&gt;&gt; &gt; times as there are endpoints and choose the one with least geodesic<br>
&gt;&gt; &gt; distance.<br>
&gt;&gt; &gt; Or alternatively, set all those end points as way points and compare<br>
&gt;&gt; &gt; their<br>
&gt;&gt; &gt; geodesics, pick the least, and use it for the path.<br>
&gt;&gt; &gt;<br>
&gt;&gt; &gt; What do you think?<br>
&gt;&gt; &gt;<br>
&gt;&gt; &gt; Thanks.<br>
&gt;&gt; &gt; Hussein<br>
&gt;&gt; &gt;<br>
&gt;&gt; &gt;<br>
&gt;&gt; &gt; On Fri, Jul 10, 2009 at 12:58 AM, asamwm &lt;<a href="mailto:asamwm@gmail.com" target="_blank">asamwm@gmail.com</a>&gt; wrote:<br>
&gt;&gt; &gt;&gt;<br>
&gt;&gt; &gt;&gt; Thanks Dan.<br>
&gt;&gt; &gt;&gt; I&#39;ll let you know when I get it in place.<br>
&gt;&gt; &gt;&gt;<br>
&gt;&gt; &gt;&gt; Regards.<br>
&gt;&gt; &gt;&gt;<br>
&gt;&gt; &gt;&gt;<br>
&gt;&gt; &gt;&gt; On Fri, Jul 10, 2009 at 12:42 AM, Dan Mueller &lt;<a href="mailto:dan.muel@gmail.com" target="_blank">dan.muel@gmail.com</a>&gt;<br>
&gt;&gt; &gt;&gt; wrote:<br>
&gt;&gt; &gt;&gt;&gt;<br>
&gt;&gt; &gt;&gt;&gt; Hi,<br>
&gt;&gt; &gt;&gt;&gt;<br>
&gt;&gt; &gt;&gt;&gt; The filter is not yet available in the main ITK code archive. You must<br>
&gt;&gt; &gt;&gt;&gt; download the article and code from here:<br>
&gt;&gt; &gt;&gt;&gt;    <a href="http://www.insight-journal.org/browse/publication/213" target="_blank">http://www.insight-journal.org/browse/publication/213</a><br>
&gt;&gt; &gt;&gt;&gt;<br>
&gt;&gt; &gt;&gt;&gt; Click on the full download &quot;.zip&quot; link and extract the files somewhere<br>
&gt;&gt; &gt;&gt;&gt; on your hard drive. As explained in the article (section 2.1, page 3)<br>
&gt;&gt; &gt;&gt;&gt; the main filter you will want to use is<br>
&gt;&gt; &gt;&gt;&gt; itk::SpeedFunctionToPathFilter, which is located under the &quot;Source&quot;<br>
&gt;&gt; &gt;&gt;&gt; folder. To use this filter within your own project, you will need to<br>
&gt;&gt; &gt;&gt;&gt; copy all of the files under the &quot;Source&quot; folder to your own source<br>
&gt;&gt; &gt;&gt;&gt; code directory.<br>
&gt;&gt; &gt;&gt;&gt;<br>
&gt;&gt; &gt;&gt;&gt; Make sure you leave a review at the journal!  ;P<br>
&gt;&gt; &gt;&gt;&gt;<br>
&gt;&gt; &gt;&gt;&gt; Hope this helps.<br>
&gt;&gt; &gt;&gt;&gt;<br>
&gt;&gt; &gt;&gt;&gt; Cheers, Dan<br>
&gt;&gt; &gt;&gt;&gt;<br>
&gt;&gt; &gt;&gt;&gt; 2009/7/9 asamwm &lt;<a href="mailto:asamwm@gmail.com" target="_blank">asamwm@gmail.com</a>&gt;:<br>
&gt;&gt; &gt;&gt;&gt; &gt; Hi all,<br>
&gt;&gt; &gt;&gt;&gt; &gt; I spent a lot of time searching for this but could not find it.<br>
&gt;&gt; &gt;&gt;&gt; &gt; There is this insight-journal publication:<br>
&gt;&gt; &gt;&gt;&gt; &gt; <a href="http://www.insight-journal.org/browse/publication/213" target="_blank">http://www.insight-journal.org/browse/publication/213</a><br>
&gt;&gt; &gt;&gt;&gt; &gt;<br>
&gt;&gt; &gt;&gt;&gt; &gt; but where is that filter? I searched under the itk code tree for<br>
&gt;&gt; &gt;&gt;&gt; &gt; the keywords, speed function, minimal path,  .. no success<br>
&gt;&gt; &gt;&gt;&gt; &gt;<br>
&gt;&gt; &gt;&gt;&gt; &gt; Any successful examples? any alternatives?<br>
&gt;&gt; &gt;&gt;&gt; &gt;<br>
&gt;&gt; &gt;&gt;&gt; &gt; Thanks<br>
&gt;&gt; &gt;&gt;&gt; &gt;<br>
&gt;&gt; &gt;&gt;&gt; &gt;<br>
&gt;&gt; &gt;&gt;&gt; &gt; _____________________________________<br>
&gt;&gt; &gt;&gt;&gt; &gt; Powered by <a href="http://www.kitware.com" target="_blank">www.kitware.com</a><br>
&gt;&gt; &gt;&gt;&gt; &gt;<br>
&gt;&gt; &gt;&gt;&gt; &gt; Visit other Kitware open-source projects at<br>
&gt;&gt; &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;&gt; &gt;<br>
&gt;&gt; &gt;&gt;&gt; &gt; Please keep messages on-topic and check the ITK FAQ at:<br>
&gt;&gt; &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;&gt; &gt;<br>
&gt;&gt; &gt;&gt;&gt; &gt; Follow this link to subscribe/unsubscribe:<br>
&gt;&gt; &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;&gt; &gt;<br>
&gt;&gt; &gt;&gt;&gt; &gt;<br>
&gt;&gt; &gt;&gt;<br>
&gt;&gt; &gt;<br>
&gt;&gt; &gt;<br>
&gt;<br>
&gt;<br>
</div></div></blockquote></div><br>
</div></div></blockquote></div><br>