7 #include <itkImageToVTKImageFilter.h>
8 #include <itkRGBPixel.h>
10 #include <itkImageFileReader.h>
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>
24 #include <fpa/Image/RegionGrow.h>
25 #include <fpa/VTK/Image2DObserver.h>
26 #include <fpa/Image/Functors/GaussianModelEstimatorFunction.h>
28 // -------------------------------------------------------------------------
29 const unsigned int Dim = 2;
30 typedef unsigned char TPixel;
31 typedef float TScalar;
33 typedef itk::Image< itk::RGBPixel< TPixel >, Dim > TColorImage;
34 typedef itk::Image< TPixel, Dim > TImage;
35 typedef itk::ImageToVTKImageFilter< TColorImage > TVTKImage;
37 // -------------------------------------------------------------------------
38 int main( int argc, char* argv[] )
43 << "Usage: " << argv[ 0 ]
44 << " input_image neighborhood_order support [model_file]"
49 std::string input_image_fn = argv[ 1 ];
50 unsigned int neighborhood_order = std::atoi( argv[ 2 ] );
51 unsigned long support = std::atoi( argv[ 3 ] );
54 itk::ImageFileReader< TColorImage >::Pointer input_image_reader =
55 itk::ImageFileReader< TColorImage >::New( );
56 input_image_reader->SetFileName( input_image_fn );
59 input_image_reader->Update( );
61 catch( itk::ExceptionObject& err )
64 << "Error while reading image from " << input_image_fn << ": "
69 TColorImage::ConstPointer input_image = input_image_reader->GetOutput( );
70 TVTKImage::Pointer vtk_input_image = TVTKImage::New( );
71 vtk_input_image->SetInput( input_image );
72 vtk_input_image->Update( );
75 vtkSmartPointer< vtkImageActor > actor =
76 vtkSmartPointer< vtkImageActor >::New( );
77 actor->SetInputData( vtk_input_image->GetOutput( ) );
79 vtkSmartPointer< vtkRenderer > renderer =
80 vtkSmartPointer< vtkRenderer >::New( );
81 renderer->SetBackground( 0.1, 0.2, 0.7 );
82 renderer->AddActor( actor );
83 vtkSmartPointer< vtkRenderWindow > window =
84 vtkSmartPointer< vtkRenderWindow >::New( );
85 window->SetSize( 800, 800 );
86 window->AddRenderer( renderer );
88 // Correct camera due to the loaded image
89 vtkCamera* camera = renderer->GetActiveCamera( );
90 camera->SetViewUp( 0, -1, 0 );
91 camera->SetPosition( 0, 0, -1 );
92 camera->SetFocalPoint( 0, 0, 0 );
95 vtkSmartPointer< vtkInteractorStyleImage > imageStyle =
96 vtkSmartPointer< vtkInteractorStyleImage >::New( );
97 vtkSmartPointer< vtkRenderWindowInteractor > interactor =
98 vtkSmartPointer< vtkRenderWindowInteractor >::New( );
99 interactor->SetInteractorStyle( imageStyle );
100 window->SetInteractor( interactor );
102 // Create the widget and its representation
103 vtkSmartPointer< vtkPointHandleRepresentation3D > handle =
104 vtkSmartPointer< vtkPointHandleRepresentation3D >::New( );
105 handle->GetProperty( )->SetColor( 1, 0, 0 );
106 vtkSmartPointer< vtkSeedRepresentation > rep =
107 vtkSmartPointer< vtkSeedRepresentation >::New( );
108 rep->SetHandleRepresentation( handle );
110 vtkSmartPointer< vtkSeedWidget > widget =
111 vtkSmartPointer< vtkSeedWidget >::New( );
112 widget->SetInteractor( interactor );
113 widget->SetRepresentation( rep );
115 // Let some interaction
116 interactor->Initialize( );
117 renderer->ResetCamera( );
120 interactor->Start( );
122 // Prepare region grow function
123 typedef fpa::Image::Functors::GaussianModelEstimatorFunction< TColorImage, TScalar > TFunction;
124 TFunction::Pointer function = TFunction::New( );
125 function->SetModelSupport( support );
127 function->LoadModelFromFile( argv[ 4 ] );
129 // Prepare region grow filter
130 typedef fpa::Image::RegionGrow< TColorImage, TImage > TFilter;
131 TFilter::Pointer filter = TFilter::New( );
132 filter->SetInput( input_image );
133 filter->SetMembershipFunction( function );
134 filter->SetNeighborhoodOrder( neighborhood_order );
135 filter->SetOutsideValue( TPixel( 0 ) );
136 filter->SetInsideValue( std::numeric_limits< TPixel >::max( ) );
137 filter->StopAtOneFrontOff( );
139 // Get user-given seeds
140 for( unsigned int s = 0; s < rep->GetNumberOfSeeds( ); s++ )
143 rep->GetSeedWorldPosition( s, pos );
145 TImage::PointType pnt;
146 pnt[ 0 ] = TImage::PointType::ValueType( pos[ 0 ] );
147 pnt[ 1 ] = TImage::PointType::ValueType( pos[ 1 ] );
149 TImage::IndexType idx;
150 if( input_image->TransformPhysicalPointToIndex( pnt, idx ) )
151 filter->AddSeed( idx, 0 );
155 // Prepare graphical debugger
156 typedef fpa::VTK::Image2DObserver< TFilter, vtkRenderWindow > TDebugger;
157 TDebugger::Pointer debugger = TDebugger::New( );
158 debugger->SetRenderWindow( window );
159 debugger->SetRenderPercentage( 0.001 );
160 filter->AddObserver( itk::AnyEvent( ), debugger );
161 filter->ThrowEventsOn( );
168 interactor->Start( );