#include #include #include #include #include #include #include #include #include #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 < 3 ) { std::cerr << "Usage: " << argv[ 0 ] << " input_image neighborhood_order" << std::endl; return( 1 ); } // fi std::string input_image_fn = argv[ 1 ]; unsigned int neighborhood_order = std::atoi( argv[ 2 ] ); // 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:: RegionGrowThresholdFunction< 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->StopAtOneFrontOff( ); // Associate seed TImage::PointType pnt; TImage::IndexType idx; viewer.GetSeed( pnt, 0 ); if( input_image->TransformPhysicalPointToIndex( pnt, idx ) ) filter->AddSeed( idx, 0 ); function->SetLowerThreshold( input_image->GetPixel( idx ) ); function->SetUpperThreshold( input_image->GetPixel( idx ) ); // 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$