+#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$