]> Creatis software - FrontAlgorithms.git/blob - appli/examples/example_IncrementalRegionGrow_Thresholds.cxx
...
[FrontAlgorithms.git] / appli / examples / example_IncrementalRegionGrow_Thresholds.cxx
1 #include <cstdlib>
2 #include <iostream>
3 #include <fstream>
4 #include <limits>
5 #include <string>
6 #include <vector>
7
8 #include <itkImage.h>
9 #include <itkImageToVTKImageFilter.h>
10
11 #include <itkImageFileReader.h>
12 #include <itkImageFileWriter.h>
13
14 #include <vtkCamera.h>
15 #include <vtkImageActor.h>
16 #include <vtkInteractorStyleImage.h>
17 #include <vtkPointHandleRepresentation3D.h>
18 #include <vtkProperty.h>
19 #include <vtkRenderer.h>
20 #include <vtkRenderWindow.h>
21 #include <vtkRenderWindowInteractor.h>
22 #include <vtkSeedRepresentation.h>
23 #include <vtkSeedWidget.h>
24 #include <vtkSmartPointer.h>
25
26 #include <fpa/Image/Dijkstra.h>
27 #include <fpa/Image/Functors/ImageAbsoluteDifferenceCostFunction.h>
28 #include <fpa/VTK/ImageMPR.h>
29 #include <fpa/VTK/Image3DObserver.h>
30
31 // -------------------------------------------------------------------------
32 const unsigned int Dim = 3;
33 typedef float TInputPixel;
34 typedef float TOutputPixel;
35
36 typedef itk::Image< TInputPixel, Dim >            TInputImage;
37 typedef itk::Image< TOutputPixel, Dim >           TOutputImage;
38 typedef itk::ImageToVTKImageFilter< TInputImage > TVTKInputImage;
39
40 // -------------------------------------------------------------------------
41 int main( int argc, char* argv[] )
42 {
43   if( argc < 8 )
44   {
45     std::cerr
46       << "Usage: " << argv[ 0 ]
47       << " input_image input_seeds output_image"
48       << " neighborhood_order stop_at_one_front"
49       << " init_seed end_seed"
50       << std::endl;
51     return( 1 );
52
53   } // fi
54   std::string input_image_fn = argv[ 1 ];
55   std::string input_seeds_fn = argv[ 2 ];
56   std::string output_image_fn = argv[ 3 ];
57   unsigned int neighborhood_order = std::atoi( argv[ 4 ] );
58   bool stop_at_one_front = ( std::atoi( argv[ 5 ] ) != 0 );
59   unsigned int init_seed = std::atoi( argv[ 6 ] );
60   unsigned int end_seed = std::atoi( argv[ 7 ] );
61
62   // Read image
63   itk::ImageFileReader< TInputImage >::Pointer input_image_reader =
64     itk::ImageFileReader< TInputImage >::New( );
65   input_image_reader->SetFileName( input_image_fn );
66   try
67   {
68     input_image_reader->Update( );
69   }
70   catch( itk::ExceptionObject& err )
71   {
72     std::cerr
73       << "Error while reading image from " << input_image_fn << ": "
74       << err << std::endl;
75     return( 1 );
76
77   } // yrt
78   TInputImage::ConstPointer input_image = input_image_reader->GetOutput( );
79   TVTKInputImage::Pointer vtk_input_image = TVTKInputImage::New( );
80   vtk_input_image->SetInput( input_image );
81   vtk_input_image->Update( );
82
83   // Show input image and let some interaction
84   fpa::VTK::ImageMPR view;
85   view.SetBackground( 0.3, 0.2, 0.8 );
86   view.SetSize( 600, 600 );
87   view.SetImage( vtk_input_image->GetOutput( ) );
88
89   // Allow some interaction
90   view.Render( );
91   view.Start( );
92
93   // Prepare region grow filter and cost function
94   typedef fpa::Image::Dijkstra< TInputImage, TOutputImage > TFilter;
95   typedef fpa::Image::Functors::
96     ImageAbsoluteDifferenceCostFunction< TFilter::TInputImage, TFilter::TResult >
97     TCost;
98
99   TCost::Pointer cost = TCost::New( );
100
101   TFilter::Pointer filter = TFilter::New( );
102   filter->SetInput( input_image );
103   filter->SetCostFunction( cost );
104   filter->SetConversionFunction( NULL );
105   filter->SetNeighborhoodOrder( neighborhood_order );
106   filter->SetStopAtOneFront( stop_at_one_front );
107
108   // Get user-given seeds
109   std::ifstream input_seeds_str( input_seeds_fn.c_str( ) );
110   if( !input_seeds_str )
111   {
112     std::cerr << "Error opening \"" << input_seeds_fn << "\"" << std::endl;
113     return( 1 );
114
115   } // fi
116
117   unsigned int nSeeds;
118   input_seeds_str >> nSeeds;
119   std::vector< TInputImage::IndexType > input_seeds;
120   for( unsigned int s = 0; s < nSeeds; s++ )
121   {
122     TInputImage::IndexType idx;
123     input_seeds_str >> idx[ 0 ] >> idx[ 1 ] >> idx[ 2 ];
124     input_seeds.push_back( idx );
125
126   } // rof
127   input_seeds_str.close( );
128
129   filter->AddSeed( input_seeds[ init_seed ], 0 );
130   filter->AddSeed( input_seeds[ end_seed ], 0 );
131
132   // Prepare graphical debugger
133   typedef fpa::VTK::Image3DObserver< TFilter, vtkRenderWindow > TDebugger;
134   TDebugger::Pointer debugger = TDebugger::New( );
135   debugger->SetRenderWindow( view.GetWindow( ) );
136   debugger->SetRenderPercentage( 0.0001 );
137   filter->AddObserver( itk::AnyEvent( ), debugger );
138   filter->ThrowEventsOn( );
139
140   // Go!
141   filter->Update( );
142
143   // Save final total cost map
144   itk::ImageFileWriter< TOutputImage >::Pointer output_image_writer =
145     itk::ImageFileWriter< TOutputImage >::New( );
146   output_image_writer->SetFileName( output_image_fn );
147   output_image_writer->SetInput( filter->GetOutput( ) );
148   try
149   {
150     output_image_writer->Update( );
151   }
152   catch( itk::ExceptionObject& err )
153   {
154     std::cerr
155       << "Error while writing image to " << output_image_fn << ": "
156       << err << std::endl;
157     return( 1 );
158
159   } // yrt
160
161   return( 0 );
162 }
163
164 // eof - $RCSfile$