7 #include <itkImageToVTKImageFilter.h>
8 #include <itkRGBPixel.h>
10 #include <itkImageFileReader.h>
11 #include <itkImageFileWriter.h>
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>
25 #include <fpa/Image/Dijkstra.h>
26 #include <fpa/VTK/Image2DObserver.h>
28 // -------------------------------------------------------------------------
29 const unsigned int Dim = 2;
30 typedef itk::RGBPixel< unsigned char > TInputPixel;
31 typedef float TOutputPixel;
33 typedef itk::Image< TInputPixel, Dim > TInputImage;
34 typedef itk::Image< TOutputPixel, Dim > TOutputImage;
35 typedef itk::ImageToVTKImageFilter< TInputImage > TVTKInputImage;
37 // -------------------------------------------------------------------------
38 int main( int argc, char* argv[] )
43 << "Usage: " << argv[ 0 ]
44 << " input_image output_image neighborhood_order stop_at_one_front"
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 );
55 itk::ImageFileReader< TInputImage >::Pointer input_image_reader =
56 itk::ImageFileReader< TInputImage >::New( );
57 input_image_reader->SetFileName( input_image_fn );
60 input_image_reader->Update( );
62 catch( itk::ExceptionObject& err )
65 << "Error while reading image from " << input_image_fn << ": "
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( );
76 vtkSmartPointer< vtkImageActor > actor =
77 vtkSmartPointer< vtkImageActor >::New( );
78 actor->SetInputData( vtk_input_image->GetOutput( ) );
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 );
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 );
96 vtkSmartPointer< vtkInteractorStyleImage > imageStyle =
97 vtkSmartPointer< vtkInteractorStyleImage >::New( );
98 vtkSmartPointer< vtkRenderWindowInteractor > interactor =
99 vtkSmartPointer< vtkRenderWindowInteractor >::New( );
100 interactor->SetInteractorStyle( imageStyle );
101 window->SetInteractor( interactor );
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 );
111 vtkSmartPointer< vtkSeedWidget > widget =
112 vtkSmartPointer< vtkSeedWidget >::New( );
113 widget->SetInteractor( interactor );
114 widget->SetRepresentation( rep );
116 // Let some interaction
117 interactor->Initialize( );
118 renderer->ResetCamera( );
121 interactor->Start( );
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 );
130 // Get user-given seeds
131 for( unsigned int s = 0; s < rep->GetNumberOfSeeds( ); s++ )
134 rep->GetSeedWorldPosition( s, pos );
136 TInputImage::PointType pnt;
137 pnt[ 0 ] = TInputImage::PointType::ValueType( pos[ 0 ] );
138 pnt[ 1 ] = TInputImage::PointType::ValueType( pos[ 1 ] );
140 TInputImage::IndexType idx;
141 if( input_image->TransformPhysicalPointToIndex( pnt, idx ) )
142 filter->AddSeed( idx, 0 );
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( );
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( ) );
164 output_image_writer->Update( );
166 catch( itk::ExceptionObject& err )
169 << "Error while writing image to " << output_image_fn << ": "