<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN">
<html>
  <head>

    <meta http-equiv="content-type" content="text/html; charset=ISO-8859-1">
  </head>
  <body bgcolor="#ffffff" text="#3333ff">
    Hi all,<br>
    <br>
    &nbsp;&nbsp;&nbsp; I'm a new User to ITK and have been learning it for past few
    days. I managed to run the example codes and observe the same
    results available in software guide document. <br>
    <br>
    Currently I'm trying to develop my GeodesicActiveContourImageFilter,
    which is similar to the one provided in the examples/segmentation
    folder but does not use FastMarchingImageFilter for generation of
    initial Level Set. Instead relies on user input for this initial
    level-set.<br>
    I've modified the example code accordingly and observed that the
    DistanceMap obtained using DanielssonDistanceMapImageFilter matches
    exactly the distance-map of initial level set generated by Example
    code. However my final segmentation result is not the same, despite
    the parameters for all other filters in two codes have been kept the
    same. My complete code is&nbsp; below. <br>
    <br>
    Can anyone give me hints as to what I might be missing. I've removed
    the FastMarchingImageFilter all together. Any kind off help would be
    highly appreciated !!! Or cite me an easier way to debug things ?<br>
    <br>
    <br>
    #include "itkImage.h"<br>
    #include "itkGeodesicActiveContourLevelSetImageFilter.h"<br>
    #include "itkCurvatureAnisotropicDiffusionImageFilter.h"<br>
    #include "itkGradientMagnitudeRecursiveGaussianImageFilter.h"<br>
    #include "itkSigmoidImageFilter.h"<br>
    //#include "itkFastMarchingImageFilter.h"<br>
    #include "itkRescaleIntensityImageFilter.h"<br>
    #include "itkBinaryThresholdImageFilter.h"<br>
    #include "itkImageFileReader.h"<br>
    #include "itkImageFileWriter.h"<br>
    <br>
    #include "itkDanielssonDistanceMapImageFilter.h"&nbsp; //Include for
    distance map<br>
    <br>
    int main( int argc, char *argv[] )<br>
    {<br>
    &nbsp; if( argc &lt; 10 )<br>
    &nbsp;&nbsp;&nbsp; {<br>
    &nbsp;&nbsp;&nbsp; std::cerr &lt;&lt; "Missing Parameters " &lt;&lt; std::endl;<br>
    &nbsp;&nbsp;&nbsp; std::cerr &lt;&lt; "Usage: " &lt;&lt; argv[0];<br>
    &nbsp;&nbsp;&nbsp; std::cerr &lt;&lt; " inputImage&nbsp; initialLevelSet outputImage";<br>
    &nbsp;&nbsp;&nbsp; std::cerr &lt;&lt; " Sigma SigmoidAlpha SigmoidBeta";<br>
    &nbsp;&nbsp;&nbsp; std::cerr &lt;&lt; " CurvatureScaling AdvectionTerm
    PropagationScaling"&nbsp; &lt;&lt; std::endl;<br>
    &nbsp;&nbsp;&nbsp; return 1;<br>
    &nbsp;&nbsp;&nbsp; }<br>
    <br>
    &nbsp; std::cout &lt;&lt; "Debug Point 1" &lt;&lt; std::endl;<br>
    <br>
    &nbsp; typedef&nbsp;&nbsp; float&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; InternalPixelType;<br>
    &nbsp; const&nbsp;&nbsp;&nbsp;&nbsp; unsigned int&nbsp;&nbsp;&nbsp; Dimension = 2;<br>
    &nbsp; typedef itk::Image&lt; InternalPixelType, Dimension &gt;&nbsp;
    InternalImageType;<br>
    &nbsp; typedef unsigned char&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; OutputPixelType;<br>
    &nbsp; typedef itk::Image&lt; OutputPixelType, Dimension &gt;
    OutputImageType;<br>
    &nbsp; typedef itk::BinaryThresholdImageFilter&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; InternalImageType, <br>
    &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; OutputImageType&nbsp;&nbsp;&nbsp; &gt;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;
    ThresholdingFilterType;<br>
    &nbsp; <br>
    &nbsp; ThresholdingFilterType::Pointer thresholder =
    ThresholdingFilterType::New();<br>
    &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; <br>
    &nbsp; thresholder-&gt;SetLowerThreshold( -1000.0 );<br>
    &nbsp; thresholder-&gt;SetUpperThreshold(&nbsp;&nbsp;&nbsp;&nbsp; 0.0 );<br>
    <br>
    &nbsp; thresholder-&gt;SetOutsideValue(&nbsp; 0&nbsp; );<br>
    &nbsp; thresholder-&gt;SetInsideValue(&nbsp; 255 );<br>
    &nbsp;&nbsp;&nbsp; <br>
    &nbsp; typedef itk::DanielssonDistanceMapImageFilter&lt;<br>
    &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; InternalImageType, InternalImageType &gt;
    DistanceMapFilterType;<br>
    &nbsp; DistanceMapFilterType::Pointer distanceMap =
    DistanceMapFilterType::New();&nbsp;&nbsp; //Instantiating the DistanceMap
    filter<br>
    <br>
    <br>
    &nbsp; std::cout &lt;&lt; "Debug Point 3" &lt;&lt; std::endl;&nbsp;&nbsp;&nbsp; <br>
    &nbsp; typedef&nbsp; itk::ImageFileReader&lt; InternalImageType &gt;
    ReaderType;<br>
    &nbsp; typedef&nbsp; itk::ImageFileWriter&lt;&nbsp; OutputImageType&nbsp; &gt;
    WriterType;<br>
    <br>
    &nbsp; ReaderType::Pointer reader = ReaderType::New();&nbsp; //reads image<br>
    &nbsp; ReaderType::Pointer reader2 = ReaderType::New(); //reads
    thresholded initial level-set&nbsp;&nbsp; //reading the inital binary
    level-set image<br>
    &nbsp; WriterType::Pointer writer = WriterType::New(); <br>
    <br>
    &nbsp; reader-&gt;SetFileName( argv[1] );<br>
    &nbsp; reader2-&gt;SetFileName( argv[2] );<br>
    &nbsp; writer-&gt;SetFileName( argv[3] );<br>
    &nbsp; typedef itk::RescaleIntensityImageFilter&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; InternalImageType, <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; OutputImageType &gt;&nbsp;&nbsp;
    CastFilterType;<br>
    &nbsp; typedef&nbsp;&nbsp; itk::CurvatureAnisotropicDiffusionImageFilter&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; InternalImageType, <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; InternalImageType &gt;&nbsp;
    SmoothingFilterType;<br>
    <br>
    &nbsp; SmoothingFilterType::Pointer smoothing =
    SmoothingFilterType::New();<br>
    &nbsp; typedef&nbsp;&nbsp; itk::GradientMagnitudeRecursiveGaussianImageFilter&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; InternalImageType, <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; InternalImageType &gt;&nbsp;
    GradientFilterType;<br>
    &nbsp; typedef&nbsp;&nbsp; itk::SigmoidImageFilter&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; InternalImageType, <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; InternalImageType &gt;&nbsp;
    SigmoidFilterType;<br>
    <br>
    &nbsp; GradientFilterType::Pointer&nbsp; gradientMagnitude =
    GradientFilterType::New();<br>
    <br>
    &nbsp; SigmoidFilterType::Pointer sigmoid = SigmoidFilterType::New();<br>
    &nbsp; sigmoid-&gt;SetOutputMinimum(&nbsp; 0.0&nbsp; );<br>
    &nbsp; sigmoid-&gt;SetOutputMaximum(&nbsp; 1.0&nbsp; );<br>
    &nbsp; <br>
    &nbsp; typedef&nbsp; itk::GeodesicActiveContourLevelSetImageFilter&lt;
    InternalImageType, <br>
    &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; InternalImageType &gt;&nbsp;&nbsp;&nbsp;
    GeodesicActiveContourFilterType;<br>
    &nbsp; GeodesicActiveContourFilterType::Pointer geodesicActiveContour = <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;&nbsp;&nbsp;&nbsp;&nbsp;
    GeodesicActiveContourFilterType::New(); <br>
    &nbsp; <br>
    &nbsp; const double propagationScaling = atof( argv[9] );<br>
    &nbsp; const double curvatureScaling = atof( argv[7] );<br>
    &nbsp; const double advectionScaling = atof( argv[8] );<br>
    &nbsp; geodesicActiveContour-&gt;SetPropagationScaling(
    propagationScaling );<br>
    &nbsp; geodesicActiveContour-&gt;SetCurvatureScaling( curvatureScaling );<br>
    &nbsp; geodesicActiveContour-&gt;SetAdvectionScaling( advectionScaling );<br>
    &nbsp; std::cout &lt;&lt; "Debug Point 7" &lt;&lt; std::endl;<br>
    &nbsp; geodesicActiveContour-&gt;SetMaximumRMSError( 0.02 );<br>
    &nbsp; geodesicActiveContour-&gt;SetNumberOfIterations(800);<br>
    &nbsp; <br>
    &nbsp; smoothing-&gt;SetInput( reader-&gt;GetOutput() );<br>
    &nbsp; gradientMagnitude-&gt;SetInput( smoothing-&gt;GetOutput() );<br>
    &nbsp; sigmoid-&gt;SetInput( gradientMagnitude-&gt;GetOutput() );<br>
    <br>
    &nbsp; distanceMap-&gt;SetInput( reader2-&gt;GetOutput() );<br>
    &nbsp; geodesicActiveContour-&gt;SetInput(&nbsp; distanceMap-&gt;GetOutput()
    );&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; //our distance Mapped initial level-set<br>
    &nbsp; geodesicActiveContour-&gt;SetFeatureImage( sigmoid-&gt;GetOutput()
    );<br>
    <br>
    &nbsp; thresholder-&gt;SetInput( geodesicActiveContour-&gt;GetOutput() );<br>
    &nbsp; writer-&gt;SetInput( thresholder-&gt;GetOutput() );<br>
    <br>
    &nbsp; smoothing-&gt;SetTimeStep( 0.125 );<br>
    &nbsp; smoothing-&gt;SetNumberOfIterations(&nbsp; 5 );<br>
    &nbsp; smoothing-&gt;SetConductanceParameter( 9.0 );<br>
    &nbsp; std::cout &lt;&lt; "Debug Point 9" &lt;&lt; std::endl;<br>
    &nbsp; const double sigma = atof( argv[4] );<br>
    &nbsp; gradientMagnitude-&gt;SetSigma(&nbsp; sigma&nbsp; );<br>
    &nbsp; const double alpha =&nbsp; atof( argv[5] );<br>
    &nbsp; const double beta&nbsp; =&nbsp; atof( argv[6] );<br>
    &nbsp; sigmoid-&gt;SetAlpha( alpha );<br>
    &nbsp; sigmoid-&gt;SetBeta(&nbsp; beta&nbsp; );<br>
    &nbsp; std::cout &lt;&lt; "Debug Point 9.1" &lt;&lt; std::endl;<br>
    &nbsp; <br>
    &nbsp; CastFilterType::Pointer caster1 = CastFilterType::New();<br>
    &nbsp; CastFilterType::Pointer caster2 = CastFilterType::New();<br>
    &nbsp; CastFilterType::Pointer caster3 = CastFilterType::New();<br>
    &nbsp; CastFilterType::Pointer caster4 = CastFilterType::New();<br>
    <br>
    &nbsp; WriterType::Pointer writer1 = WriterType::New();<br>
    &nbsp; WriterType::Pointer writer2 = WriterType::New();<br>
    &nbsp; WriterType::Pointer writer3 = WriterType::New();<br>
    &nbsp; WriterType::Pointer writer4 = WriterType::New();<br>
    &nbsp; std::cout &lt;&lt; "Debug Point 9.15" &lt;&lt; std::endl;<br>
    <br>
    &nbsp; caster1-&gt;SetInput( smoothing-&gt;GetOutput() );<br>
    &nbsp; writer1-&gt;SetInput( caster1-&gt;GetOutput() );<br>
    &nbsp;
writer1-&gt;SetFileName("myGeodesicActiveContourImageFilterOutput1.png");<br>
    &nbsp; caster1-&gt;SetOutputMinimum(&nbsp;&nbsp; 0 );<br>
    &nbsp; caster1-&gt;SetOutputMaximum( 255 );<br>
    &nbsp; writer1-&gt;Update();<br>
    &nbsp; std::cout &lt;&lt; "Debug Point 9.2" &lt;&lt; std::endl;<br>
    <br>
    &nbsp; caster2-&gt;SetInput( gradientMagnitude-&gt;GetOutput() );<br>
    &nbsp; writer2-&gt;SetInput( caster2-&gt;GetOutput() );<br>
    &nbsp;
writer2-&gt;SetFileName("myGeodesicActiveContourImageFilterOutput2.png");<br>
    &nbsp; caster2-&gt;SetOutputMinimum(&nbsp;&nbsp; 0 );<br>
    &nbsp; caster2-&gt;SetOutputMaximum( 255 );<br>
    &nbsp; writer2-&gt;Update();<br>
    &nbsp; std::cout &lt;&lt; "Debug Point 9.3" &lt;&lt; std::endl;<br>
    <br>
    &nbsp; caster3-&gt;SetInput( sigmoid-&gt;GetOutput() );<br>
    &nbsp; writer3-&gt;SetInput( caster3-&gt;GetOutput() );<br>
    &nbsp;
writer3-&gt;SetFileName("myGeodesicActiveContourImageFilterOutput3.png");<br>
    &nbsp; caster3-&gt;SetOutputMinimum(&nbsp;&nbsp; 0 );<br>
    &nbsp; caster3-&gt;SetOutputMaximum( 255 );<br>
    &nbsp; writer3-&gt;Update();<br>
    <br>
    &nbsp; //caster4-&gt;SetInput( distanceMap-&gt;GetOutput() );<br>
    &nbsp; caster4-&gt;SetInput( geodesicActiveContour-&gt;GetInput());<br>
    &nbsp; writer4-&gt;SetInput( caster4-&gt;GetOutput() );<br>
    &nbsp;
writer4-&gt;SetFileName("myGeodesicActiveContourImageFilterOutput4.png");<br>
    &nbsp; caster4-&gt;SetOutputMinimum(&nbsp;&nbsp; 0 );<br>
    &nbsp; caster4-&gt;SetOutputMaximum( 255 );<br>
    &nbsp; //writer4-&gt;Update();<br>
    <br>
    &nbsp; std::cout &lt;&lt; "Debug Point 10" &lt;&lt; std::endl;<br>
    &nbsp; <br>
    &nbsp; try<br>
    &nbsp;&nbsp;&nbsp; {<br>
    &nbsp;&nbsp;&nbsp; writer-&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; "Exception caught !" &lt;&lt; std::endl;<br>
    &nbsp;&nbsp;&nbsp; std::cerr &lt;&lt; excep &lt;&lt; std::endl;<br>
    &nbsp;&nbsp;&nbsp; }<br>
    &nbsp; <br>
    <br>
    &nbsp; // Print out some useful information <br>
    &nbsp; std::cout &lt;&lt; std::endl;<br>
    &nbsp; std::cout &lt;&lt; "Max. no. iterations: " &lt;&lt;
    geodesicActiveContour-&gt;GetNumberOfIterations() &lt;&lt;
    std::endl;<br>
    &nbsp; std::cout &lt;&lt; "Max. RMS error: " &lt;&lt;
    geodesicActiveContour-&gt;GetMaximumRMSError() &lt;&lt; std::endl;<br>
    &nbsp; std::cout &lt;&lt; std::endl;<br>
    &nbsp; std::cout &lt;&lt; "No. elpased iterations: " &lt;&lt;
    geodesicActiveContour-&gt;GetElapsedIterations() &lt;&lt; std::endl;<br>
    &nbsp; std::cout &lt;&lt; "RMS change: " &lt;&lt;
    geodesicActiveContour-&gt;GetRMSChange() &lt;&lt; std::endl;<br>
    <br>
    &nbsp; writer4-&gt;Update();<br>
    &nbsp; return 0;<br>
    }
  </body>
</html>