]> Creatis software - FrontAlgorithms.git/blob - appli/examples/example_ImageAlgorithmDijkstra_02.cxx
728313e6e0eb51fa7a1e3f7a3403470a4802713e
[FrontAlgorithms.git] / appli / examples / example_ImageAlgorithmDijkstra_02.cxx
1 #include <iostream>
2 #include <limits>
3 #include <string>
4
5 #include <itkImage.h>
6 #include <itkImageFileReader.h>
7 #include <itkRGBAPixel.h>
8 #include <itkSignedDanielssonDistanceMapImageFilter.h>
9 #include <itkImageToVTKImageFilter.h>
10
11 #include <vtkImageActor.h>
12 #include <vtkInteractorStyleImage.h>
13 #include <vtkPointHandleRepresentation3D.h>
14 #include <vtkProperty.h>
15 #include <vtkRenderer.h>
16 #include <vtkRenderWindow.h>
17 #include <vtkRenderWindowInteractor.h>
18 #include <vtkSeedRepresentation.h>
19 #include <vtkSeedWidget.h>
20 #include <vtkSmartPointer.h>
21
22 #include <fpa/Image/Dijkstra.h>
23 #include <fpa/Base/Functors/InvertCostFunction.h>
24 #include <fpa/Base/TreeExtractor.h>
25 #include <fpa/VTK/Image2DObserver.h>
26
27 // -------------------------------------------------------------------------
28 const unsigned int Dim = 2;
29 typedef unsigned char TPixel;
30 typedef itk::RGBAPixel< TPixel > TRGBAPixel;
31 typedef double TScalar;
32 typedef itk::Image< TPixel, Dim >  TImage;
33 typedef itk::Image< TScalar, Dim > TDistanceMap;
34 typedef itk::Image< TRGBAPixel, Dim > TRGBAImage;
35 typedef itk::ImageToVTKImageFilter< TImage > TVTKImage;
36 typedef itk::ImageToVTKImageFilter< TRGBAImage > TVTKRGBAImage;
37
38 typedef itk::ImageFileReader< TImage > TImageReader;
39 typedef
40 itk::SignedDanielssonDistanceMapImageFilter< TImage, TDistanceMap >
41 TDistanceFilter;
42
43 typedef fpa::Image::Dijkstra< TDistanceMap, TScalar > TFrontAlgorithm;
44 typedef fpa::Base::TreeExtractor< TFrontAlgorithm >   TExtractor;
45 typedef fpa::Base::Functors::InvertCostFunction< TScalar > TScalarFunction;
46
47 typedef
48 fpa::VTK::Image2DObserver< TExtractor, vtkRenderWindow >
49 TObserver;
50
51 // -------------------------------------------------------------------------
52 int main( int argc, char* argv[] )
53 {
54   if( argc < 2 )
55   {
56     std::cerr
57       << "Usage: " << argv[ 0 ]
58       << " input_image [stop_at_one_front]" << std::endl;
59     return( 1 );
60
61   } // fi
62   std::string input_image_fn = argv[ 1 ];
63   bool stop_at_one_front = false;
64   if( 2 < argc )
65     stop_at_one_front = ( std::atoi( argv[ 2 ] ) == 1 );
66
67   // Read image
68   TImageReader::Pointer input_image_reader = TImageReader::New( );
69   input_image_reader->SetFileName( input_image_fn );
70   try
71   {
72     input_image_reader->Update( );
73   }
74   catch( itk::ExceptionObject& err )
75   {
76     std::cerr << "Error caught: " << err << std::endl;
77     return( 1 );
78
79   } // yrt
80     
81   TDistanceFilter::Pointer dist_filter = TDistanceFilter::New( );
82   dist_filter->SetInput( input_image_reader->GetOutput( ) );
83   dist_filter->InsideIsPositiveOn( );
84   dist_filter->SquaredDistanceOff( );
85   dist_filter->Update( );
86
87   TImage::ConstPointer input_image = input_image_reader->GetOutput( );
88
89   TVTKImage::Pointer vtk_image = TVTKImage::New( );
90   vtk_image->SetInput( input_image );
91   vtk_image->Update( );
92
93   // VTK visualization
94   vtkSmartPointer< vtkImageActor > actor =
95     vtkSmartPointer< vtkImageActor >::New( );
96   actor->SetInputData( vtk_image->GetOutput( ) );
97
98   vtkSmartPointer< vtkRenderer > renderer =
99     vtkSmartPointer< vtkRenderer >::New( );
100   renderer->SetBackground( 0.1, 0.2, 0.7 );
101   renderer->AddActor( actor );
102   vtkSmartPointer< vtkRenderWindow > window =
103     vtkSmartPointer< vtkRenderWindow >::New( );
104   window->SetSize( 800, 800 );
105   window->AddRenderer( renderer );
106
107   // VTK interaction
108   vtkSmartPointer< vtkInteractorStyleImage > imageStyle =
109     vtkSmartPointer< vtkInteractorStyleImage >::New( );
110   vtkSmartPointer< vtkRenderWindowInteractor > interactor =
111     vtkSmartPointer< vtkRenderWindowInteractor >::New( );
112   interactor->SetInteractorStyle( imageStyle );
113   window->SetInteractor( interactor );
114   window->Render( );
115
116   // Create the widget and its representation
117   vtkSmartPointer< vtkPointHandleRepresentation3D > handle =
118     vtkSmartPointer< vtkPointHandleRepresentation3D >::New( );
119   handle->GetProperty( )->SetColor( 1, 0, 0 );
120   vtkSmartPointer< vtkSeedRepresentation > rep =
121     vtkSmartPointer< vtkSeedRepresentation >::New( );
122   rep->SetHandleRepresentation( handle );
123
124   vtkSmartPointer< vtkSeedWidget > widget =
125     vtkSmartPointer< vtkSeedWidget >::New( );
126   widget->SetInteractor( interactor );
127   widget->SetRepresentation( rep );
128
129   // Let some interaction
130   interactor->Initialize( );
131   window->Render( );
132   widget->On( );
133   interactor->Start( );
134
135   // Configure observer
136   TObserver::Pointer obs = TObserver::New( );
137   obs->SetImage( dist_filter->GetOutput( ), window );
138
139   // Configure membership function
140   TScalarFunction::Pointer cost_function = TScalarFunction::New( );
141
142   // Configure algorithm
143   TExtractor::Pointer algorithm = TExtractor::New( );
144   for( unsigned int s = 0; s < rep->GetNumberOfSeeds( ); s++ )
145   {
146     double pos[ 3 ];
147     rep->GetSeedWorldPosition( s, pos );
148
149     TImage::PointType pnt;
150     pnt[ 0 ] = pos[ 0 ];
151     pnt[ 1 ] = pos[ 1 ];
152
153     TImage::IndexType idx;
154     if( input_image->TransformPhysicalPointToIndex( pnt, idx ) )
155     {
156       algorithm->AddSeed( idx, 0 );
157       if( s == 0 )
158         algorithm->SetRoot( idx );
159       else
160         algorithm->AddLeaf( idx );
161
162     } // fi
163
164   } // rof
165   algorithm->AddObserver( itk::AnyEvent( ), obs );
166   algorithm->ThrowEventsOn( );
167   algorithm->SetInput( dist_filter->GetOutput( ) );
168   algorithm->SetNeighborhoodOrder( 1 );
169   algorithm->SetStopAtOneFront( stop_at_one_front );
170   algorithm->SetCostConversion( cost_function );
171   algorithm->Update( );
172
173   // Create image with tree
174   TPixel transparent_color[] = { 0, 0, 0, 0 };
175   TPixel solid_color[] = { 255, 255, 0, 255 };
176   TRGBAImage::Pointer tree_image = TRGBAImage::New( );
177   tree_image->CopyInformation( input_image );
178   tree_image->SetRequestedRegionToLargestPossibleRegion( );
179   tree_image->SetBufferedRegion( tree_image->GetRequestedRegion( ) );
180   tree_image->Allocate( );
181   tree_image->FillBuffer( TRGBAPixel( transparent_color ) );
182
183   const TExtractor::TTree& tree = algorithm->GetTree( );
184   TExtractor::TTree::const_iterator tIt = tree.begin( );
185   for( ; tIt != tree.end( ); ++tIt )
186     tree_image->SetPixel( tIt->first, TRGBAPixel( solid_color ) );
187
188   TVTKRGBAImage::Pointer vtk_tree_image = TVTKRGBAImage::New( );
189   vtk_tree_image->SetInput( tree_image );
190   vtk_tree_image->Update( );
191
192   vtkSmartPointer< vtkImageActor > tree_actor =
193     vtkSmartPointer< vtkImageActor >::New( );
194   tree_actor->SetInputData( vtk_tree_image->GetOutput( ) );
195
196   renderer->AddActor( tree_actor );
197   window->Render( );
198
199   // One last interaction
200   interactor->Start( );
201
202   return( 0 );
203 }
204
205 // eof - $RCSfile$