]> Creatis software - FrontAlgorithms.git/blob - appli/examples/example_Image_RegionGrow_AllPixels.cxx
...
[FrontAlgorithms.git] / appli / examples / example_Image_RegionGrow_AllPixels.cxx
1 #include <cstdlib>
2 #include <iostream>
3 #include <limits>
4 #include <string>
5
6 #include <itkImage.h>
7 #include <itkImageToVTKImageFilter.h>
8
9 #include <fpa/Image/RegionGrow.h>
10 #include <fpa/Image/Functors/RegionGrowAllBelongsFunction.h>
11 #include <fpa/VTK/Image2DObserver.h>
12
13 #include "fpa_Utility.h"
14
15 // -------------------------------------------------------------------------
16 const unsigned int Dim = 2;
17 typedef unsigned char TPixel;
18 typedef itk::Image< TPixel, Dim > TImage;
19
20 // -------------------------------------------------------------------------
21 int main( int argc, char* argv[] )
22 {
23   if( argc < 4 )
24   {
25     std::cerr
26       << "Usage: " << argv[ 0 ]
27       << " input_image neighborhood_order stop_at_one_front"
28       << std::endl;
29     return( 1 );
30
31   } // fi
32   std::string input_image_fn = argv[ 1 ];
33   unsigned int neighborhood_order = std::atoi( argv[ 2 ] );
34   bool stop_at_one_front = ( std::atoi( argv[ 3 ] ) != 0 );
35
36   // Read image
37   TImage::Pointer input_image;
38   std::string err = fpa_Utility::ReadImage( input_image, input_image_fn );
39   if( err != "" )
40   {
41     std::cerr << err << std::endl;
42     return( 1 );
43
44   } // fi
45
46   // Show image and wait for, at least, one seed
47   itk::ImageToVTKImageFilter< TImage >::Pointer vtk_input_image =
48     itk::ImageToVTKImageFilter< TImage >::New( );
49   vtk_input_image->SetInput( input_image );
50   vtk_input_image->Update( );
51
52   fpa_Utility::Viewer2DWithSeeds viewer;
53   viewer.SetImage( vtk_input_image->GetOutput( ) );
54   while( viewer.GetNumberOfSeeds( ) == 0 )
55     viewer.Start( );
56
57   // Region growing types
58   typedef fpa::Image::RegionGrow< TImage > TFilter;
59   typedef fpa::Image::Functors::
60     RegionGrowAllBelongsFunction< TImage > TFunction;
61
62   // Prepare region grow function
63   TFunction::Pointer function = TFunction::New( );
64
65   // Prepare region grow filter
66   TFilter::Pointer filter = TFilter::New( );
67   filter->SetInput( input_image );
68   filter->SetGrowingFunction( function );
69   filter->SetNeighborhoodOrder( neighborhood_order );
70   filter->SetOutsideValue( TPixel( 0 ) );
71   filter->SetInsideValue( std::numeric_limits< TPixel >::max( ) );
72   filter->SetStopAtOneFront( stop_at_one_front );
73
74   // Associate seeds
75   for( unsigned long s = 0; s < viewer.GetNumberOfSeeds( ); ++s )
76   {
77     TImage::PointType pnt;
78     TImage::IndexType idx;
79     viewer.GetSeed( pnt, s );
80     if( input_image->TransformPhysicalPointToIndex( pnt, idx ) )
81       filter->AddSeed( idx, 0 );
82
83   } // rof
84
85   // Prepare graphical debugger
86   typedef fpa::VTK::Image2DObserver< TFilter, vtkRenderWindow > TDebugger;
87   TDebugger::Pointer debugger = TDebugger::New( );
88   debugger->SetRenderWindow( viewer.Window );
89   debugger->SetRenderPercentage( 0.01 );
90   filter->AddObserver( itk::AnyEvent( ), debugger );
91   filter->ThrowEventsOn( );
92
93   // Go!
94   filter->Update( );
95
96   // Some more interaction and finish
97   viewer.Start( );
98   return( 0 );
99 }
100
101 // eof - $RCSfile$