6 #include <itkImageFileReader.h>
7 #include <itkSignedDanielssonDistanceMapImageFilter.h>
8 #include <itkImageToVTKImageFilter.h>
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>
21 #include <fpa/Image/RegionGrow.h>
22 #include <fpa/Image/Functors/RegionGrowThresholdFunction.h>
23 #include <fpa/VTK/Image2DObserver.h>
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;
32 typedef itk::ImageFileReader< TImage > TImageReader;
33 typedef fpa::Image::RegionGrow< TImage > TFrontAlgorithm;
36 fpa::Image::Functors::RegionGrowThresholdFunction< TImage >
40 fpa::VTK::Image2DObserver< TFrontAlgorithm, vtkRenderWindow >
43 // -------------------------------------------------------------------------
44 int main( int argc, char* argv[] )
49 << "Usage: " << argv[ 0 ]
50 << " input_image lower_threshold upper_threshold" << std::endl;
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 ] ) );
59 TImageReader::Pointer input_image_reader = TImageReader::New( );
60 input_image_reader->SetFileName( input_image_fn );
63 input_image_reader->Update( );
65 catch( itk::ExceptionObject& err )
67 std::cerr << "Error caught: " << err << std::endl;
71 TImage::ConstPointer input_image = input_image_reader->GetOutput( );
73 TVTKImage::Pointer vtk_image = TVTKImage::New( );
74 vtk_image->SetInput( input_image );
78 vtkSmartPointer< vtkImageActor > actor =
79 vtkSmartPointer< vtkImageActor >::New( );
80 actor->SetInputData( vtk_image->GetOutput( ) );
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 );
92 vtkSmartPointer< vtkInteractorStyleImage > imageStyle =
93 vtkSmartPointer< vtkInteractorStyleImage >::New( );
94 vtkSmartPointer< vtkRenderWindowInteractor > interactor =
95 vtkSmartPointer< vtkRenderWindowInteractor >::New( );
96 interactor->SetInteractorStyle( imageStyle );
97 window->SetInteractor( interactor );
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 );
108 vtkSmartPointer< vtkSeedWidget > widget =
109 vtkSmartPointer< vtkSeedWidget >::New( );
110 widget->SetInteractor( interactor );
111 widget->SetRepresentation( rep );
113 // Let some interaction
114 interactor->Initialize( );
117 interactor->Start( );
119 // Configure observer
120 TObserver::Pointer obs = TObserver::New( );
121 obs->SetImage( input_image, window );
123 // Configure membership function
124 TMembershipFunction::Pointer membership = TMembershipFunction::New( );
125 membership->SetLowerThreshold( lower_threshold );
126 membership->SetUpperThreshold( upper_threshold );
128 // Configure algorithm
129 TFrontAlgorithm::Pointer algorithm = TFrontAlgorithm::New( );
130 for( unsigned int s = 0; s < rep->GetNumberOfSeeds( ); s++ )
133 rep->GetSeedWorldPosition( s, pos );
135 TImage::PointType pnt;
136 pnt[ 0 ] = TScalar( pos[ 0 ] );
137 pnt[ 1 ] = TScalar( pos[ 1 ] );
139 TImage::IndexType idx;
140 if( input_image->TransformPhysicalPointToIndex( pnt, idx ) )
141 algorithm->AddSeed( idx, 0 );
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( );
151 // One last interaction
152 interactor->Start( );