X-Git-Url: https://git.creatis.insa-lyon.fr/pubgit/?a=blobdiff_plain;f=appli%2Fexamples%2Fexample_ImageAlgorithmRegionGrow_MultipleThresholds.cxx;h=e9b06cc7238e475e0ac725120740153abc752cde;hb=58beec8ea1d7265ffa6a8842f6a56fc3c0706524;hp=ff821034776c889ffcd7cf53accbb754a63c90cb;hpb=972dd44060dfff40ba3daab899c6365445f6de7e;p=FrontAlgorithms.git diff --git a/appli/examples/example_ImageAlgorithmRegionGrow_MultipleThresholds.cxx b/appli/examples/example_ImageAlgorithmRegionGrow_MultipleThresholds.cxx index ff82103..e9b06cc 100644 --- a/appli/examples/example_ImageAlgorithmRegionGrow_MultipleThresholds.cxx +++ b/appli/examples/example_ImageAlgorithmRegionGrow_MultipleThresholds.cxx @@ -1,3 +1,4 @@ +#include #include #include #include @@ -5,9 +6,11 @@ #include #include +#include #include #include +#include #include #include #include @@ -27,6 +30,7 @@ typedef itk::Image< TPixel, Dim > TImage; typedef itk::ImageToVTKImageFilter< TImage > TVTKImage; typedef itk::ImageFileReader< TImage > TImageReader; +typedef itk::ImageFileWriter< TImage > TImageWriter; typedef fpa::Image::RegionGrowWithMultipleThresholds< TImage > @@ -38,18 +42,24 @@ TObserver; // ------------------------------------------------------------------------- int main( int argc, char* argv[] ) { - if( argc < 5 ) + if( argc < 6 ) { std::cerr << "Usage: " << argv[ 0 ] - << " input_image thr_0 thr_1 n_samples" << std::endl; + << " input_image thr_0 thr_1 step output_image" + << " visual_debug" + << 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 ] ); + unsigned int step = std::atoi( argv[ 4 ] ); + std::string output_image_fn = argv[ 5 ]; + bool visual_debug = false; + if( argc > 6 ) + visual_debug = ( std::atoi( argv[ 6 ] ) == 1 ); // Read image TImageReader::Pointer input_image_reader = TImageReader::New( ); @@ -93,23 +103,63 @@ int main( int argc, char* argv[] ) 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->AddThresholds( thr_0, thr_1, step ); algorithm->AddSeed( seed_idx, 0 ); - algorithm->AddObserver( itk::AnyEvent( ), obs ); - algorithm->ThrowEventsOn( ); algorithm->SetInput( input_image ); algorithm->SetNeighborhoodOrder( 1 ); - algorithm->SetDerivativeThreshold( double( 3 ) ); + algorithm->SetDifferenceThreshold( double( 3 ) ); + + if( visual_debug ) + { + // Configure observer + TObserver::Pointer obs = TObserver::New( ); + obs->SetImage( input_image, view.GetWindow( ) ); + algorithm->AddObserver( itk::AnyEvent( ), obs ); + algorithm->ThrowEventsOn( ); + } + else + algorithm->ThrowEventsOff( ); + + std::clock_t start = std::clock( ); algorithm->Update( ); + std::clock_t end = std::clock( ); + double seconds = double( end - start ) / double( CLOCKS_PER_SEC ); + std::cout << "Execution time = " << seconds << std::endl; + + // Show result + TVTKImage::Pointer output_image_vtk = TVTKImage::New( ); + output_image_vtk->SetInput( algorithm->GetOutput( ) ); + output_image_vtk->Update( ); + + vtkSmartPointer< vtkImageMarchingCubes > mc = + vtkSmartPointer< vtkImageMarchingCubes >::New( ); + mc->SetInputData( output_image_vtk->GetOutput( ) ); + mc->SetValue( + 0, + double( algorithm->GetInsideValue( ) ) * double( 0.95 ) + ); + mc->Update( ); // Let some interaction and close program + view.AddPolyData( mc->GetOutput( ), 0.1, 0.6, 0.8, 0.5 ); view.Start( ); + + // Write resulting image + TImageWriter::Pointer output_image_writer = TImageWriter::New( ); + output_image_writer->SetInput( algorithm->GetOutput( ) ); + output_image_writer->SetFileName( output_image_fn ); + try + { + output_image_writer->Update( ); + } + catch( itk::ExceptionObject& err ) + { + std::cerr << "Error caught: " << err << std::endl; + return( 1 ); + + } // yrt return( 0 ); }