-#include <cstdlib>
-#include <iostream>
-#include <limits>
-#include <string>
-
-#include <itkImage.h>
-#include <itkImageToVTKImageFilter.h>
-
-#include <fpa/Image/RegionGrow.h>
-#include <fpa/Image/Functors/RegionGrowAllBelongsFunction.h>
-#include <fpa/VTK/Image2DObserver.h>
-
-#include "fpa_Utility.h"
-
-// -------------------------------------------------------------------------
-const unsigned int Dim = 2;
-typedef unsigned char TPixel;
-typedef itk::Image< TPixel, Dim > TImage;
-
-// -------------------------------------------------------------------------
-int main( int argc, char* argv[] )
-{
- if( argc < 4 )
- {
- std::cerr
- << "Usage: " << argv[ 0 ]
- << " input_image neighborhood_order stop_at_one_front"
- << std::endl;
- return( 1 );
-
- } // fi
- std::string input_image_fn = argv[ 1 ];
- unsigned int neighborhood_order = std::atoi( argv[ 2 ] );
- bool stop_at_one_front = ( std::atoi( argv[ 3 ] ) != 0 );
-
- // Read image
- TImage::Pointer input_image;
- std::string err = fpa_Utility::ReadImage( input_image, input_image_fn );
- if( err != "" )
- {
- std::cerr << err << std::endl;
- return( 1 );
-
- } // fi
-
- // Show image and wait for, at least, one seed
- itk::ImageToVTKImageFilter< TImage >::Pointer vtk_input_image =
- itk::ImageToVTKImageFilter< TImage >::New( );
- vtk_input_image->SetInput( input_image );
- vtk_input_image->Update( );
-
- fpa_Utility::Viewer2DWithSeeds viewer;
- viewer.SetImage( vtk_input_image->GetOutput( ) );
- while( viewer.GetNumberOfSeeds( ) == 0 )
- viewer.Start( );
-
- // Region growing types
- typedef fpa::Image::RegionGrow< TImage > TFilter;
- typedef fpa::Image::Functors::
- RegionGrowAllBelongsFunction< TImage > TFunction;
-
- // Prepare region grow function
- TFunction::Pointer function = TFunction::New( );
-
- // Prepare region grow filter
- TFilter::Pointer filter = TFilter::New( );
- filter->SetInput( input_image );
- filter->SetGrowingFunction( function );
- filter->SetNeighborhoodOrder( neighborhood_order );
- filter->SetOutsideValue( TPixel( 0 ) );
- filter->SetInsideValue( std::numeric_limits< TPixel >::max( ) );
- filter->SetStopAtOneFront( stop_at_one_front );
-
- // Associate seeds
- for( unsigned long s = 0; s < viewer.GetNumberOfSeeds( ); ++s )
- {
- TImage::PointType pnt;
- TImage::IndexType idx;
- viewer.GetSeed( pnt, s );
- if( input_image->TransformPhysicalPointToIndex( pnt, idx ) )
- filter->AddSeed( idx, 0 );
-
- } // rof
-
- // Prepare graphical debugger
- typedef fpa::VTK::Image2DObserver< TFilter, vtkRenderWindow > TDebugger;
- TDebugger::Pointer debugger = TDebugger::New( );
- debugger->SetRenderWindow( viewer.Window );
- debugger->SetRenderPercentage( 0.01 );
- filter->AddObserver( itk::AnyEvent( ), debugger );
- filter->ThrowEventsOn( );
-
- // Go!
- filter->Update( );
-
- // Some more interaction and finish
- viewer.Start( );
- return( 0 );
-}
-
-// eof - $RCSfile$