]> Creatis software - FrontAlgorithms.git/blob - appli/examples/example_Image_IncrementalRegionGrow_Thresholds.cxx
3261b6076ce69484b7e1d3b384e74eee67ee43a8
[FrontAlgorithms.git] / appli / examples / example_Image_IncrementalRegionGrow_Thresholds.cxx
1 #include <cstdlib>
2 #include <iostream>
3 #include <fstream>
4 #include <string>
5 #include <vector>
6
7 #include <itkImage.h>
8 #include <itkImageToVTKImageFilter.h>
9
10 #include <itkImageFileReader.h>
11 #include <itkImageFileWriter.h>
12
13 #include <fpa/VTK/ImageMPR.h>
14 #include <fpa/Image/IncrementalRegionGrow.h>
15 #include <fpa/Image/Functors/RegionGrowThresholdFunction.h>
16
17 /*
18   #include <vtkCamera.h>
19   #include <vtkImageActor.h>
20   #include <vtkInteractorStyleImage.h>
21   #include <vtkPointHandleRepresentation3D.h>
22   #include <vtkProperty.h>
23   #include <vtkRenderer.h>
24   #include <vtkRenderWindow.h>
25   #include <vtkRenderWindowInteractor.h>
26   #include <vtkSeedRepresentation.h>
27   #include <vtkSeedWidget.h>
28   #include <vtkSmartPointer.h>
29
30   #include <fpa/Image/Functors/ImageAbsoluteDifferenceCostFunction.h>
31   #include <fpa/VTK/Image3DObserver.h>
32 */
33
34 // -------------------------------------------------------------------------
35 const unsigned int Dim = 3;
36 typedef short TInputPixel;
37 typedef short TOutputPixel;
38
39 typedef itk::Image< TInputPixel, Dim >            TInputImage;
40 typedef itk::Image< TOutputPixel, Dim >           TOutputImage;
41 typedef itk::ImageToVTKImageFilter< TInputImage > TVTKInputImage;
42
43 // -------------------------------------------------------------------------
44 int main( int argc, char* argv[] )
45 {
46   if( argc < 8 )
47   {
48     std::cerr
49       << "Usage: " << argv[ 0 ] << std::endl
50       << "\tinput_image" << std::endl
51       << "\toutput_image" << std::endl
52       << "\tneighborhood_order" << std::endl
53       << "\tstop_at_one_front" << std::endl
54       << "\tinit_threshold" << std::endl
55       << "\tend_threshold" << std::endl
56       << "\tsamples" << std::endl
57       << "\t[input_seeds]" << std::endl;
58     return( 1 );
59
60   } // fi
61   std::string input_image_fn = argv[ 1 ];
62   std::string output_image_fn = argv[ 2 ];
63   unsigned int neighborhood_order = std::atoi( argv[ 3 ] );
64   bool stop_at_one_front = ( std::atoi( argv[ 4 ] ) != 0 );
65   TInputPixel init_threshold = TInputPixel( std::atof( argv[ 5 ] ) );
66   TInputPixel end_threshold = TInputPixel( std::atof( argv[ 6 ] ) );
67   unsigned int samples = TInputPixel( std::atof( argv[ 7 ] ) );
68   std::string input_seeds_fn = ( argc >= 9 )? argv[ 8 ]: "";
69
70   // Read image
71   itk::ImageFileReader< TInputImage >::Pointer input_image_reader =
72     itk::ImageFileReader< TInputImage >::New( );
73   input_image_reader->SetFileName( input_image_fn );
74   try
75   {
76     input_image_reader->Update( );
77   }
78   catch( itk::ExceptionObject& err )
79   {
80     std::cerr
81       << "Error while reading image from " << input_image_fn << ": "
82       << err << std::endl;
83     return( 1 );
84
85   } // yrt
86   TInputImage::ConstPointer input_image = input_image_reader->GetOutput( );
87   TVTKInputImage::Pointer vtk_input_image = TVTKInputImage::New( );
88   vtk_input_image->SetInput( input_image );
89   vtk_input_image->Update( );
90
91   // Show input image and let some interaction
92   fpa::VTK::ImageMPR view;
93   view.SetBackground( 0.3, 0.2, 0.8 );
94   view.SetSize( 600, 600 );
95   view.SetImage( vtk_input_image->GetOutput( ) );
96   view.Render( );
97
98   // Read seeds
99   std::vector< TInputImage::IndexType > input_seeds;
100   if( input_seeds_fn != "" )
101   {
102     std::ifstream input_seeds_str( input_seeds_fn.c_str( ) );
103     if( input_seeds_str )
104     {
105       unsigned int nSeeds;
106       input_seeds_str >> nSeeds;
107       for( unsigned int i = 0; i < nSeeds; ++i )
108       {
109         TInputImage::PointType pnt;
110         input_seeds_str >> pnt[ 0 ] >> pnt[ 1 ] >> pnt[ 2 ];
111
112         TInputImage::IndexType idx;
113         input_image_reader->GetOutput( )->
114           TransformPhysicalPointToIndex( pnt, idx );
115         input_seeds.push_back( idx );
116
117         view.AddSeed( pnt[ 0 ], pnt[ 1 ], pnt[ 2 ] );
118
119       } // rof
120       input_seeds_str.close( );
121     }
122     else
123       std::cerr << "Error reading \"" << input_seeds_fn << "\"" << std::endl;
124
125   } // fi
126
127   // Allow some interaction
128   view.Render( );
129   if( input_seeds.size( ) == 0 )
130   {
131     while( view.GetNumberOfSeeds( ) == 0 )
132       view.Start( );
133
134     for( unsigned int i = 0; i < view.GetNumberOfSeeds( ); ++i )
135     {
136       double p[ 3 ];
137       view.GetSeed( i, p );
138
139       TInputImage::PointType pnt;
140       pnt[ 0 ] = p[ 0 ];
141       pnt[ 1 ] = p[ 1 ];
142       pnt[ 2 ] = p[ 2 ];
143
144       TInputImage::IndexType idx;
145       input_image_reader->GetOutput( )->
146         TransformPhysicalPointToIndex( pnt, idx );
147       input_seeds.push_back( idx );
148
149     } // rof
150   }
151   else
152     view.Start( );
153
154   // Prepare region grow filter and cost function
155   typedef fpa::Image::
156     IncrementalRegionGrow< TInputImage, TOutputImage > TFilter;
157   typedef fpa::Image::Functors::
158     RegionGrowThresholdFunction< TInputImage > TFunction;
159
160   TFilter::Pointer filter = TFilter::New( );
161   filter->SetInput( input_image_reader->GetOutput( ) );
162
163   /*
164     typedef fpa::Image::Dijkstra< TInputImage, TOutputImage > TFilter;
165     typedef fpa::Image::Functors::
166     ImageAbsoluteDifferenceCostFunction< TFilter::TInputImage, TFilter::TResult >
167     TCost;
168
169     TCost::Pointer cost = TCost::New( );
170
171     TFilter::Pointer filter = TFilter::New( );
172     filter->SetInput( input_image );
173     filter->SetCostFunction( cost );
174     filter->SetConversionFunction( NULL );
175     filter->SetNeighborhoodOrder( neighborhood_order );
176     filter->SetStopAtOneFront( stop_at_one_front );
177
178     // Get user-given seeds
179     std::ifstream input_seeds_str( input_seeds_fn.c_str( ) );
180     if( !input_seeds_str )
181     {
182     std::cerr << "Error opening \"" << input_seeds_fn << "\"" << std::endl;
183     return( 1 );
184
185     } // fi
186
187     unsigned int nSeeds;
188     input_seeds_str >> nSeeds;
189     std::vector< TInputImage::IndexType > input_seeds;
190     for( unsigned int s = 0; s < nSeeds; s++ )
191     {
192     TInputImage::IndexType idx;
193     input_seeds_str >> idx[ 0 ] >> idx[ 1 ] >> idx[ 2 ];
194     input_seeds.push_back( idx );
195
196     } // rof
197     input_seeds_str.close( );
198
199     filter->AddSeed( input_seeds[ init_seed ], 0 );
200     filter->AddSeed( input_seeds[ end_seed ], 0 );
201
202     // Prepare graphical debugger
203     typedef fpa::VTK::Image3DObserver< TFilter, vtkRenderWindow > TDebugger;
204     TDebugger::Pointer debugger = TDebugger::New( );
205     debugger->SetRenderWindow( view.GetWindow( ) );
206     debugger->SetRenderPercentage( 0.0001 );
207     filter->AddObserver( itk::AnyEvent( ), debugger );
208     filter->ThrowEventsOn( );
209
210     // Go!
211     filter->Update( );
212
213     // Save final total cost map
214     itk::ImageFileWriter< TOutputImage >::Pointer output_image_writer =
215     itk::ImageFileWriter< TOutputImage >::New( );
216     output_image_writer->SetFileName( output_image_fn );
217     output_image_writer->SetInput( filter->GetOutput( ) );
218     try
219     {
220     output_image_writer->Update( );
221     }
222     catch( itk::ExceptionObject& err )
223     {
224     std::cerr
225     << "Error while writing image to " << output_image_fn << ": "
226     << err << std::endl;
227     return( 1 );
228
229     } // yrt
230   */
231
232   return( 0 );
233 }
234
235 // eof - $RCSfile$