#include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include // ------------------------------------------------------------------------- const unsigned int Dim = 3; typedef short TPixel; typedef double TScalar; typedef itk::Image< TPixel, Dim > TImage; typedef itk::ImageToVTKImageFilter< TImage > TVTKImage; typedef itk::ImageFileReader< TImage > TImageReader; typedef fpa::Image::RegionGrowWithMultipleThresholds< TImage > TFrontAlgorithm; typedef fpa::VTK::Image3DObserver< TFrontAlgorithm, vtkRenderWindow > TObserver; // ------------------------------------------------------------------------- int main( int argc, char* argv[] ) { if( argc < 5 ) { std::cerr << "Usage: " << argv[ 0 ] << " input_image thr_0 thr_1 n_samples" << std::endl; return( 1 ); } // fi std::string input_image_fn = argv[ 1 ]; TPixel thr_0 = TPixel( std::atof( argv[ 2 ] ) ); TPixel thr_1 = TPixel( std::atof( argv[ 3 ] ) ); unsigned int n_samples = std::atoi( argv[ 4 ] ); // Read image TImageReader::Pointer input_image_reader = TImageReader::New( ); input_image_reader->SetFileName( input_image_fn ); try { input_image_reader->Update( ); } catch( itk::ExceptionObject& err ) { std::cerr << "Error caught: " << err << std::endl; return( 1 ); } // yrt TImage::ConstPointer input_image = input_image_reader->GetOutput( ); TImage::SpacingType spac = input_image->GetSpacing( ); double min_spac = spac[ 0 ]; for( unsigned int d = 1; d < Dim; d++ ) min_spac = ( spac[ d ] < min_spac )? spac[ d ]: min_spac; TVTKImage::Pointer vtk_image = TVTKImage::New( ); vtk_image->SetInput( input_image ); vtk_image->Update( ); fpa::VTK::ImageMPR view; view.SetBackground( 0.3, 0.2, 0.8 ); view.SetSize( 800, 800 ); view.SetImage( vtk_image->GetOutput( ) ); // Wait for a seed to be given while( view.GetNumberOfSeeds( ) == 0 ) view.Start( ); // Convert seed double seed[ 3 ]; view.GetSeed( 0, seed ); TImage::PointType seed_pnt; seed_pnt[ 0 ] = seed[ 0 ]; seed_pnt[ 1 ] = seed[ 1 ]; seed_pnt[ 2 ] = seed[ 2 ]; TImage::IndexType seed_idx; input_image->TransformPhysicalPointToIndex( seed_pnt, seed_idx ); // Configure observer TObserver::Pointer obs = TObserver::New( ); obs->SetImage( input_image, view.GetWindow( ) ); // Configure algorithm TFrontAlgorithm::Pointer algorithm = TFrontAlgorithm::New( ); algorithm->AddThresholds( thr_0, thr_1, n_samples ); algorithm->AddSeed( seed_idx, 0 ); algorithm->AddObserver( itk::AnyEvent( ), obs ); algorithm->ThrowEventsOn( ); algorithm->SetInput( input_image ); algorithm->SetNeighborhoodOrder( 1 ); algorithm->SetDerivativeThreshold( double( 3 ) ); algorithm->Update( ); // Let some interaction and close program view.Start( ); return( 0 ); } // eof - $RCSfile$