#include #include #include #include #include #include #include #include #include #include #include #include /* #include #include #include #include #include #include #include #include #include #include #include #include #include */ // ------------------------------------------------------------------------- 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$