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