7 #include <itkImageToVTKImageFilter.h>
9 #include <itkImageFileReader.h>
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>
23 #include <fpa/Image/RegionGrow.h>
24 #include <fpa/Base/Functors/TautologyFunction.h>
25 #include <fpa/VTK/Image2DObserver.h>
27 // -------------------------------------------------------------------------
28 const unsigned int Dim = 2;
29 typedef unsigned char TPixel;
31 typedef itk::Image< TPixel, Dim > TImage;
32 typedef itk::ImageToVTKImageFilter< TImage > TVTKImage;
34 // -------------------------------------------------------------------------
35 int main( int argc, char* argv[] )
40 << "Usage: " << argv[ 0 ]
41 << " input_image neighborhood_order stop_at_one_front"
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 );
51 itk::ImageFileReader< TImage >::Pointer input_image_reader =
52 itk::ImageFileReader< TImage >::New( );
53 input_image_reader->SetFileName( input_image_fn );
56 input_image_reader->Update( );
58 catch( itk::ExceptionObject& err )
61 << "Error while reading image from " << input_image_fn << ": "
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( );
72 vtkSmartPointer< vtkImageActor > actor =
73 vtkSmartPointer< vtkImageActor >::New( );
74 actor->SetInputData( vtk_input_image->GetOutput( ) );
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 );
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 );
92 vtkSmartPointer< vtkInteractorStyleImage > imageStyle =
93 vtkSmartPointer< vtkInteractorStyleImage >::New( );
94 vtkSmartPointer< vtkRenderWindowInteractor > interactor =
95 vtkSmartPointer< vtkRenderWindowInteractor >::New( );
96 interactor->SetInteractorStyle( imageStyle );
97 window->SetInteractor( interactor );
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 );
107 vtkSmartPointer< vtkSeedWidget > widget =
108 vtkSmartPointer< vtkSeedWidget >::New( );
109 widget->SetInteractor( interactor );
110 widget->SetRepresentation( rep );
112 // Let some interaction
113 interactor->Initialize( );
114 renderer->ResetCamera( );
117 interactor->Start( );
119 // Prepare region grow function
120 typedef fpa::Base::Functors::TautologyFunction< TImage::PixelType > TFunction;
121 TFunction::Pointer function = TFunction::New( );
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 );
133 // Get user-given seeds
134 for( unsigned int s = 0; s < rep->GetNumberOfSeeds( ); s++ )
137 rep->GetSeedWorldPosition( s, pos );
139 TImage::PointType pnt;
140 pnt[ 0 ] = TImage::PointType::ValueType( pos[ 0 ] );
141 pnt[ 1 ] = TImage::PointType::ValueType( pos[ 1 ] );
143 TImage::IndexType idx;
144 if( input_image->TransformPhysicalPointToIndex( pnt, idx ) )
145 filter->AddSeed( idx, 0 );
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.01 );
154 filter->AddObserver( itk::AnyEvent( ), debugger );
155 filter->ThrowEventsOn( );