]> Creatis software - FrontAlgorithms.git/blob - appli/examples/example_ImageAlgorithmRegionGrow_01.cxx
...
[FrontAlgorithms.git] / appli / examples / example_ImageAlgorithmRegionGrow_01.cxx
1 #include <iostream>
2 #include <limits>
3 #include <string>
4
5 #include <itkImage.h>
6 #include <itkImageFileReader.h>
7 #include <itkSignedDanielssonDistanceMapImageFilter.h>
8 #include <itkImageToVTKImageFilter.h>
9
10 #include <vtkImageActor.h>
11 #include <vtkInteractorStyleImage.h>
12 #include <vtkPointHandleRepresentation3D.h>
13 #include <vtkProperty.h>
14 #include <vtkRenderer.h>
15 #include <vtkRenderWindow.h>
16 #include <vtkRenderWindowInteractor.h>
17 #include <vtkSeedRepresentation.h>
18 #include <vtkSeedWidget.h>
19 #include <vtkSmartPointer.h>
20
21 #include <fpa/Image/RegionGrow.h>
22 #include <fpa/Image/Functors/RegionGrowThresholdFunction.h>
23 #include <fpa/VTK/Image2DObserver.h>
24
25 // -------------------------------------------------------------------------
26 const unsigned int Dim = 2;
27 typedef unsigned char TPixel;
28 typedef double TScalar;
29 typedef itk::Image< TPixel, Dim >  TImage;
30 typedef itk::ImageToVTKImageFilter< TImage > TVTKImage;
31
32 typedef itk::ImageFileReader< TImage >   TImageReader;
33 typedef fpa::Image::RegionGrow< TImage > TFrontAlgorithm;
34
35 typedef
36 fpa::Image::Functors::RegionGrowThresholdFunction< TImage >
37 TMembershipFunction;
38
39 typedef
40 fpa::VTK::Image2DObserver< TFrontAlgorithm, vtkRenderWindow >
41 TObserver;
42
43 // -------------------------------------------------------------------------
44 int main( int argc, char* argv[] )
45 {
46   if( argc < 4 )
47   {
48     std::cerr
49       << "Usage: " << argv[ 0 ]
50       << " input_image lower_threshold upper_threshold" << std::endl;
51     return( 1 );
52
53   } // fi
54   std::string input_image_fn = argv[ 1 ];
55   TPixel lower_threshold = TPixel( std::atof( argv[ 2 ] ) );
56   TPixel upper_threshold = TPixel( std::atof( argv[ 3 ] ) );
57
58   // Read image
59   TImageReader::Pointer input_image_reader = TImageReader::New( );
60   input_image_reader->SetFileName( input_image_fn );
61   try
62   {
63     input_image_reader->Update( );
64   }
65   catch( itk::ExceptionObject& err )
66   {
67     std::cerr << "Error caught: " << err << std::endl;
68     return( 1 );
69
70   } // yrt
71   TImage::ConstPointer input_image = input_image_reader->GetOutput( );
72
73   TVTKImage::Pointer vtk_image = TVTKImage::New( );
74   vtk_image->SetInput( input_image );
75   vtk_image->Update( );
76
77   // VTK visualization
78   vtkSmartPointer< vtkImageActor > actor =
79     vtkSmartPointer< vtkImageActor >::New( );
80   actor->SetInputData( vtk_image->GetOutput( ) );
81
82   vtkSmartPointer< vtkRenderer > renderer =
83     vtkSmartPointer< vtkRenderer >::New( );
84   renderer->SetBackground( 0.1, 0.2, 0.7 );
85   renderer->AddActor( actor );
86   vtkSmartPointer< vtkRenderWindow > window =
87     vtkSmartPointer< vtkRenderWindow >::New( );
88   window->SetSize( 800, 800 );
89   window->AddRenderer( renderer );
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   window->Render( );
99
100   // Create the widget and its representation
101   vtkSmartPointer< vtkPointHandleRepresentation3D > handle =
102     vtkSmartPointer< vtkPointHandleRepresentation3D >::New( );
103   handle->GetProperty( )->SetColor( 1, 0, 0 );
104   vtkSmartPointer< vtkSeedRepresentation > rep =
105     vtkSmartPointer< vtkSeedRepresentation >::New( );
106   rep->SetHandleRepresentation( handle );
107
108   vtkSmartPointer< vtkSeedWidget > widget =
109     vtkSmartPointer< vtkSeedWidget >::New( );
110   widget->SetInteractor( interactor );
111   widget->SetRepresentation( rep );
112
113   // Let some interaction
114   interactor->Initialize( );
115   window->Render( );
116   widget->On( );
117   interactor->Start( );
118
119   // Configure observer
120   TObserver::Pointer obs = TObserver::New( );
121   obs->SetImage( input_image, window );
122
123   // Configure membership function
124   TMembershipFunction::Pointer membership = TMembershipFunction::New( );
125   membership->SetLowerThreshold( lower_threshold );
126   membership->SetUpperThreshold( upper_threshold );
127
128   // Configure algorithm
129   TFrontAlgorithm::Pointer algorithm = TFrontAlgorithm::New( );
130   for( unsigned int s = 0; s < rep->GetNumberOfSeeds( ); s++ )
131   {
132     double pos[ 3 ];
133     rep->GetSeedWorldPosition( s, pos );
134
135     TImage::PointType pnt;
136     pnt[ 0 ] = TScalar( pos[ 0 ] );
137     pnt[ 1 ] = TScalar( pos[ 1 ] );
138
139     TImage::IndexType idx;
140     if( input_image->TransformPhysicalPointToIndex( pnt, idx ) )
141       algorithm->AddSeed( idx, 0 );
142
143   } // rof
144   algorithm->AddObserver( itk::AnyEvent( ), obs );
145   algorithm->ThrowEventsOn( );
146   algorithm->SetInput( input_image );
147   algorithm->SetNeighborhoodOrder( 1 );
148   algorithm->SetMembershipFunction( membership );
149   algorithm->Update( );
150
151   // One last interaction
152   interactor->Start( );
153
154   return( 0 );
155 }
156
157 // eof - $RCSfile$