]> Creatis software - FrontAlgorithms.git/blob - appli/examples/example_Image_Dijkstra_CostFromRGBInput.cxx
...
[FrontAlgorithms.git] / appli / examples / example_Image_Dijkstra_CostFromRGBInput.cxx
1 #include <cstdlib>
2 #include <iostream>
3 #include <limits>
4 #include <string>
5
6 #include <itkImage.h>
7 #include <itkImageToVTKImageFilter.h>
8 #include <itkRGBPixel.h>
9
10 #include <itkImageFileReader.h>
11 #include <itkImageFileWriter.h>
12
13 #include <vtkCamera.h>
14 #include <vtkImageActor.h>
15 #include <vtkInteractorStyleImage.h>
16 #include <vtkPointHandleRepresentation3D.h>
17 #include <vtkProperty.h>
18 #include <vtkRenderer.h>
19 #include <vtkRenderWindow.h>
20 #include <vtkRenderWindowInteractor.h>
21 #include <vtkSeedRepresentation.h>
22 #include <vtkSeedWidget.h>
23 #include <vtkSmartPointer.h>
24
25 #include <fpa/Image/Dijkstra.h>
26 #include <fpa/VTK/Image2DObserver.h>
27
28 // -------------------------------------------------------------------------
29 const unsigned int Dim = 2;
30 typedef itk::RGBPixel< unsigned char > TInputPixel;
31 typedef float                          TOutputPixel;
32
33 typedef itk::Image< TInputPixel, Dim >            TInputImage;
34 typedef itk::Image< TOutputPixel, Dim >           TOutputImage;
35 typedef itk::ImageToVTKImageFilter< TInputImage > TVTKInputImage;
36
37 // -------------------------------------------------------------------------
38 int main( int argc, char* argv[] )
39 {
40   if( argc < 5 )
41   {
42     std::cerr
43       << "Usage: " << argv[ 0 ]
44       << " input_image output_image neighborhood_order stop_at_one_front"
45       << std::endl;
46     return( 1 );
47
48   } // fi
49   std::string input_image_fn = argv[ 1 ];
50   std::string output_image_fn = argv[ 2 ];
51   unsigned int neighborhood_order = std::atoi( argv[ 3 ] );
52   bool stop_at_one_front = ( std::atoi( argv[ 4 ] ) != 0 );
53
54   // Read image
55   itk::ImageFileReader< TInputImage >::Pointer input_image_reader =
56     itk::ImageFileReader< TInputImage >::New( );
57   input_image_reader->SetFileName( input_image_fn );
58   try
59   {
60     input_image_reader->Update( );
61   }
62   catch( itk::ExceptionObject& err )
63   {
64     std::cerr
65       << "Error while reading image from " << input_image_fn << ": "
66       << err << std::endl;
67     return( 1 );
68
69   } // yrt
70   TInputImage::ConstPointer input_image = input_image_reader->GetOutput( );
71   TVTKInputImage::Pointer vtk_input_image = TVTKInputImage::New( );
72   vtk_input_image->SetInput( input_image );
73   vtk_input_image->Update( );
74
75   // VTK visualization
76   vtkSmartPointer< vtkImageActor > actor =
77     vtkSmartPointer< vtkImageActor >::New( );
78   actor->SetInputData( vtk_input_image->GetOutput( ) );
79
80   vtkSmartPointer< vtkRenderer > renderer =
81     vtkSmartPointer< vtkRenderer >::New( );
82   renderer->SetBackground( 0.1, 0.2, 0.7 );
83   renderer->AddActor( actor );
84   vtkSmartPointer< vtkRenderWindow > window =
85     vtkSmartPointer< vtkRenderWindow >::New( );
86   window->SetSize( 800, 800 );
87   window->AddRenderer( renderer );
88
89   // Correct camera due to the loaded image
90   vtkCamera* camera = renderer->GetActiveCamera( );
91   camera->SetViewUp( 0, -1, 0 );
92   camera->SetPosition( 0, 0, -1 );
93   camera->SetFocalPoint( 0, 0, 0 );
94
95   // VTK interaction
96   vtkSmartPointer< vtkInteractorStyleImage > imageStyle =
97     vtkSmartPointer< vtkInteractorStyleImage >::New( );
98   vtkSmartPointer< vtkRenderWindowInteractor > interactor =
99     vtkSmartPointer< vtkRenderWindowInteractor >::New( );
100   interactor->SetInteractorStyle( imageStyle );
101   window->SetInteractor( interactor );
102
103   // Create the widget and its representation
104   vtkSmartPointer< vtkPointHandleRepresentation3D > handle =
105     vtkSmartPointer< vtkPointHandleRepresentation3D >::New( );
106   handle->GetProperty( )->SetColor( 1, 0, 0 );
107   vtkSmartPointer< vtkSeedRepresentation > rep =
108     vtkSmartPointer< vtkSeedRepresentation >::New( );
109   rep->SetHandleRepresentation( handle );
110
111   vtkSmartPointer< vtkSeedWidget > widget =
112     vtkSmartPointer< vtkSeedWidget >::New( );
113   widget->SetInteractor( interactor );
114   widget->SetRepresentation( rep );
115
116   // Let some interaction
117   interactor->Initialize( );
118   renderer->ResetCamera( );
119   window->Render( );
120   widget->On( );
121   interactor->Start( );
122
123   // Prepare region grow filter
124   typedef fpa::Image::Dijkstra< TInputImage, TOutputImage > TFilter;
125   TFilter::Pointer filter = TFilter::New( );
126   filter->SetInput( input_image );
127   filter->SetNeighborhoodOrder( neighborhood_order );
128   filter->SetStopAtOneFront( stop_at_one_front );
129
130   // Get user-given seeds
131   for( unsigned int s = 0; s < rep->GetNumberOfSeeds( ); s++ )
132   {
133     double pos[ 3 ];
134     rep->GetSeedWorldPosition( s, pos );
135
136     TInputImage::PointType pnt;
137     pnt[ 0 ] = TInputImage::PointType::ValueType( pos[ 0 ] );
138     pnt[ 1 ] = TInputImage::PointType::ValueType( pos[ 1 ] );
139
140     TInputImage::IndexType idx;
141     if( input_image->TransformPhysicalPointToIndex( pnt, idx ) )
142       filter->AddSeed( idx, 0 );
143
144   } // rof
145
146   // Prepare graphical debugger
147   typedef fpa::VTK::Image2DObserver< TFilter, vtkRenderWindow > TDebugger;
148   TDebugger::Pointer debugger = TDebugger::New( );
149   debugger->SetRenderWindow( window );
150   debugger->SetRenderPercentage( 0.001 );
151   filter->AddObserver( itk::AnyEvent( ), debugger );
152   filter->ThrowEventsOn( );
153
154   // Go!
155   filter->Update( );
156
157   // Save final total cost map
158   itk::ImageFileWriter< TOutputImage >::Pointer output_image_writer =
159     itk::ImageFileWriter< TOutputImage >::New( );
160   output_image_writer->SetFileName( output_image_fn );
161   output_image_writer->SetInput( filter->GetOutput( ) );
162   try
163   {
164     output_image_writer->Update( );
165   }
166   catch( itk::ExceptionObject& err )
167   {
168     std::cerr
169       << "Error while writing image to " << output_image_fn << ": "
170       << err << std::endl;
171     return( 1 );
172
173   } // yrt
174
175   return( 0 );
176 }
177
178 // eof - $RCSfile$