]> Creatis software - FrontAlgorithms.git/blobdiff - appli/examples/example_Image_IncrementalRegionGrow_Thresholds.cxx
CMake updated. Some other filters added.
[FrontAlgorithms.git] / appli / examples / example_Image_IncrementalRegionGrow_Thresholds.cxx
diff --git a/appli/examples/example_Image_IncrementalRegionGrow_Thresholds.cxx b/appli/examples/example_Image_IncrementalRegionGrow_Thresholds.cxx
new file mode 100644 (file)
index 0000000..3261b60
--- /dev/null
@@ -0,0 +1,235 @@
+#include <cstdlib>
+#include <iostream>
+#include <fstream>
+#include <string>
+#include <vector>
+
+#include <itkImage.h>
+#include <itkImageToVTKImageFilter.h>
+
+#include <itkImageFileReader.h>
+#include <itkImageFileWriter.h>
+
+#include <fpa/VTK/ImageMPR.h>
+#include <fpa/Image/IncrementalRegionGrow.h>
+#include <fpa/Image/Functors/RegionGrowThresholdFunction.h>
+
+/*
+  #include <vtkCamera.h>
+  #include <vtkImageActor.h>
+  #include <vtkInteractorStyleImage.h>
+  #include <vtkPointHandleRepresentation3D.h>
+  #include <vtkProperty.h>
+  #include <vtkRenderer.h>
+  #include <vtkRenderWindow.h>
+  #include <vtkRenderWindowInteractor.h>
+  #include <vtkSeedRepresentation.h>
+  #include <vtkSeedWidget.h>
+  #include <vtkSmartPointer.h>
+
+  #include <fpa/Image/Functors/ImageAbsoluteDifferenceCostFunction.h>
+  #include <fpa/VTK/Image3DObserver.h>
+*/
+
+// -------------------------------------------------------------------------
+const unsigned int Dim = 3;
+typedef short TInputPixel;
+typedef short TOutputPixel;
+
+typedef itk::Image< TInputPixel, Dim >            TInputImage;
+typedef itk::Image< TOutputPixel, Dim >           TOutputImage;
+typedef itk::ImageToVTKImageFilter< TInputImage > TVTKInputImage;
+
+// -------------------------------------------------------------------------
+int main( int argc, char* argv[] )
+{
+  if( argc < 8 )
+  {
+    std::cerr
+      << "Usage: " << argv[ 0 ] << std::endl
+      << "\tinput_image" << std::endl
+      << "\toutput_image" << std::endl
+      << "\tneighborhood_order" << std::endl
+      << "\tstop_at_one_front" << std::endl
+      << "\tinit_threshold" << std::endl
+      << "\tend_threshold" << std::endl
+      << "\tsamples" << std::endl
+      << "\t[input_seeds]" << std::endl;
+    return( 1 );
+
+  } // fi
+  std::string input_image_fn = argv[ 1 ];
+  std::string output_image_fn = argv[ 2 ];
+  unsigned int neighborhood_order = std::atoi( argv[ 3 ] );
+  bool stop_at_one_front = ( std::atoi( argv[ 4 ] ) != 0 );
+  TInputPixel init_threshold = TInputPixel( std::atof( argv[ 5 ] ) );
+  TInputPixel end_threshold = TInputPixel( std::atof( argv[ 6 ] ) );
+  unsigned int samples = TInputPixel( std::atof( argv[ 7 ] ) );
+  std::string input_seeds_fn = ( argc >= 9 )? argv[ 8 ]: "";
+
+  // Read image
+  itk::ImageFileReader< TInputImage >::Pointer input_image_reader =
+    itk::ImageFileReader< TInputImage >::New( );
+  input_image_reader->SetFileName( input_image_fn );
+  try
+  {
+    input_image_reader->Update( );
+  }
+  catch( itk::ExceptionObject& err )
+  {
+    std::cerr
+      << "Error while reading image from " << input_image_fn << ": "
+      << err << std::endl;
+    return( 1 );
+
+  } // yrt
+  TInputImage::ConstPointer input_image = input_image_reader->GetOutput( );
+  TVTKInputImage::Pointer vtk_input_image = TVTKInputImage::New( );
+  vtk_input_image->SetInput( input_image );
+  vtk_input_image->Update( );
+
+  // Show input image and let some interaction
+  fpa::VTK::ImageMPR view;
+  view.SetBackground( 0.3, 0.2, 0.8 );
+  view.SetSize( 600, 600 );
+  view.SetImage( vtk_input_image->GetOutput( ) );
+  view.Render( );
+
+  // Read seeds
+  std::vector< TInputImage::IndexType > input_seeds;
+  if( input_seeds_fn != "" )
+  {
+    std::ifstream input_seeds_str( input_seeds_fn.c_str( ) );
+    if( input_seeds_str )
+    {
+      unsigned int nSeeds;
+      input_seeds_str >> nSeeds;
+      for( unsigned int i = 0; i < nSeeds; ++i )
+      {
+        TInputImage::PointType pnt;
+        input_seeds_str >> pnt[ 0 ] >> pnt[ 1 ] >> pnt[ 2 ];
+
+        TInputImage::IndexType idx;
+        input_image_reader->GetOutput( )->
+          TransformPhysicalPointToIndex( pnt, idx );
+        input_seeds.push_back( idx );
+
+        view.AddSeed( pnt[ 0 ], pnt[ 1 ], pnt[ 2 ] );
+
+      } // rof
+      input_seeds_str.close( );
+    }
+    else
+      std::cerr << "Error reading \"" << input_seeds_fn << "\"" << std::endl;
+
+  } // fi
+
+  // Allow some interaction
+  view.Render( );
+  if( input_seeds.size( ) == 0 )
+  {
+    while( view.GetNumberOfSeeds( ) == 0 )
+      view.Start( );
+
+    for( unsigned int i = 0; i < view.GetNumberOfSeeds( ); ++i )
+    {
+      double p[ 3 ];
+      view.GetSeed( i, p );
+
+      TInputImage::PointType pnt;
+      pnt[ 0 ] = p[ 0 ];
+      pnt[ 1 ] = p[ 1 ];
+      pnt[ 2 ] = p[ 2 ];
+
+      TInputImage::IndexType idx;
+      input_image_reader->GetOutput( )->
+        TransformPhysicalPointToIndex( pnt, idx );
+      input_seeds.push_back( idx );
+
+    } // rof
+  }
+  else
+    view.Start( );
+
+  // Prepare region grow filter and cost function
+  typedef fpa::Image::
+    IncrementalRegionGrow< TInputImage, TOutputImage > TFilter;
+  typedef fpa::Image::Functors::
+    RegionGrowThresholdFunction< TInputImage > TFunction;
+
+  TFilter::Pointer filter = TFilter::New( );
+  filter->SetInput( input_image_reader->GetOutput( ) );
+
+  /*
+    typedef fpa::Image::Dijkstra< TInputImage, TOutputImage > TFilter;
+    typedef fpa::Image::Functors::
+    ImageAbsoluteDifferenceCostFunction< TFilter::TInputImage, TFilter::TResult >
+    TCost;
+
+    TCost::Pointer cost = TCost::New( );
+
+    TFilter::Pointer filter = TFilter::New( );
+    filter->SetInput( input_image );
+    filter->SetCostFunction( cost );
+    filter->SetConversionFunction( NULL );
+    filter->SetNeighborhoodOrder( neighborhood_order );
+    filter->SetStopAtOneFront( stop_at_one_front );
+
+    // Get user-given seeds
+    std::ifstream input_seeds_str( input_seeds_fn.c_str( ) );
+    if( !input_seeds_str )
+    {
+    std::cerr << "Error opening \"" << input_seeds_fn << "\"" << std::endl;
+    return( 1 );
+
+    } // fi
+
+    unsigned int nSeeds;
+    input_seeds_str >> nSeeds;
+    std::vector< TInputImage::IndexType > input_seeds;
+    for( unsigned int s = 0; s < nSeeds; s++ )
+    {
+    TInputImage::IndexType idx;
+    input_seeds_str >> idx[ 0 ] >> idx[ 1 ] >> idx[ 2 ];
+    input_seeds.push_back( idx );
+
+    } // rof
+    input_seeds_str.close( );
+
+    filter->AddSeed( input_seeds[ init_seed ], 0 );
+    filter->AddSeed( input_seeds[ end_seed ], 0 );
+
+    // Prepare graphical debugger
+    typedef fpa::VTK::Image3DObserver< TFilter, vtkRenderWindow > TDebugger;
+    TDebugger::Pointer debugger = TDebugger::New( );
+    debugger->SetRenderWindow( view.GetWindow( ) );
+    debugger->SetRenderPercentage( 0.0001 );
+    filter->AddObserver( itk::AnyEvent( ), debugger );
+    filter->ThrowEventsOn( );
+
+    // Go!
+    filter->Update( );
+
+    // Save final total cost map
+    itk::ImageFileWriter< TOutputImage >::Pointer output_image_writer =
+    itk::ImageFileWriter< TOutputImage >::New( );
+    output_image_writer->SetFileName( output_image_fn );
+    output_image_writer->SetInput( filter->GetOutput( ) );
+    try
+    {
+    output_image_writer->Update( );
+    }
+    catch( itk::ExceptionObject& err )
+    {
+    std::cerr
+    << "Error while writing image to " << output_image_fn << ": "
+    << err << std::endl;
+    return( 1 );
+
+    } // yrt
+  */
+
+  return( 0 );
+}
+
+// eof - $RCSfile$