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