7 #include <itkImageFileReader.h>
8 #include <itkImageToVTKImageFilter.h>
9 #include <itkMinimumMaximumImageCalculator.h>
10 #include <itkInvertIntensityImageFilter.h>
11 #include <itkDanielssonDistanceMapImageFilter.h>
12 #include <itkUnaryFunctorImageFilter.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 unsigned char TPixel;
31 typedef double TScalar;
32 typedef itk::Image< TPixel, Dim > TImage;
33 typedef itk::Image< TScalar, Dim > TScalarImage;
34 typedef itk::ImageToVTKImageFilter< TImage > TVTKImage;
36 typedef itk::ImageFileReader< TImage > TImageReader;
37 typedef fpa::Image::Dijkstra< TScalarImage, TScalar > TFrontAlgorithm;
40 fpa::VTK::Image2DObserver< TFrontAlgorithm, vtkRenderWindow >
43 // -------------------------------------------------------------------------
44 class InvertPixelFunctor
49 virtual ~InvertPixelFunctor( )
51 bool operator!=( const InvertPixelFunctor& other ) const
53 bool operator==( const InvertPixelFunctor& other ) const
54 { return( !( *this != other ) ); }
55 inline TScalar operator()( const TScalar& A ) const
57 return( TScalar( 1 ) / std::pow( TScalar( 1 ) + A, TScalar( 4 ) ) );
61 // -------------------------------------------------------------------------
62 int main( int argc, char* argv[] )
67 << "Usage: " << argv[ 0 ]
68 << " input_image neighborhood_order [stop_at_one_front]"
73 std::string input_image_fn = argv[ 1 ];
74 unsigned int neighborhood_order = std::atoi( argv[ 2 ] );
75 bool stop_at_one_front = false;
77 stop_at_one_front = ( std::atoi( argv[ 3 ] ) == 1 );
80 TImageReader::Pointer input_image_reader = TImageReader::New( );
81 input_image_reader->SetFileName( input_image_fn );
84 input_image_reader->Update( );
86 catch( itk::ExceptionObject& err )
88 std::cerr << "Error caught: " << err << std::endl;
92 TImage::ConstPointer input_image = input_image_reader->GetOutput( );
94 TVTKImage::Pointer vtk_image = TVTKImage::New( );
95 vtk_image->SetInput( input_image );
99 vtkSmartPointer< vtkImageActor > actor =
100 vtkSmartPointer< vtkImageActor >::New( );
101 actor->SetInputData( vtk_image->GetOutput( ) );
103 vtkSmartPointer< vtkRenderer > renderer =
104 vtkSmartPointer< vtkRenderer >::New( );
105 renderer->SetBackground( 0.1, 0.2, 0.7 );
106 renderer->AddActor( actor );
107 vtkSmartPointer< vtkRenderWindow > window =
108 vtkSmartPointer< vtkRenderWindow >::New( );
109 window->SetSize( 800, 800 );
110 window->AddRenderer( renderer );
113 vtkSmartPointer< vtkInteractorStyleImage > imageStyle =
114 vtkSmartPointer< vtkInteractorStyleImage >::New( );
115 vtkSmartPointer< vtkRenderWindowInteractor > interactor =
116 vtkSmartPointer< vtkRenderWindowInteractor >::New( );
117 interactor->SetInteractorStyle( imageStyle );
118 window->SetInteractor( interactor );
121 // Create the widget and its representation
122 vtkSmartPointer< vtkPointHandleRepresentation3D > handle =
123 vtkSmartPointer< vtkPointHandleRepresentation3D >::New( );
124 handle->GetProperty( )->SetColor( 1, 0, 0 );
125 vtkSmartPointer< vtkSeedRepresentation > rep =
126 vtkSmartPointer< vtkSeedRepresentation >::New( );
127 rep->SetHandleRepresentation( handle );
129 vtkSmartPointer< vtkSeedWidget > widget =
130 vtkSmartPointer< vtkSeedWidget >::New( );
131 widget->SetInteractor( interactor );
132 widget->SetRepresentation( rep );
134 // Let some interaction
135 interactor->Initialize( );
138 interactor->Start( );
141 typedef itk::MinimumMaximumImageCalculator< TImage > TMinMax;
142 typedef itk::InvertIntensityImageFilter< TImage > TInvert;
143 typedef itk::DanielssonDistanceMapImageFilter< TImage, TScalarImage > TDanielsson;
144 typedef itk::UnaryFunctorImageFilter< TScalarImage, TScalarImage, InvertPixelFunctor > TInvertFunctor;
146 TMinMax::Pointer input_image_min_max = TMinMax::New( );
147 input_image_min_max->SetImage( input_image );
148 input_image_min_max->Compute( );
150 TInvert::Pointer invert = TInvert::New( );
151 invert->SetInput( input_image );
152 invert->SetMaximum( input_image_min_max->GetMaximum( ) );
154 TDanielsson::Pointer danielsson = TDanielsson::New( );
155 danielsson->SetInput( invert->GetOutput( ) );
156 danielsson->InputIsBinaryOn( );
157 danielsson->SquaredDistanceOff( );
158 danielsson->UseImageSpacingOn( );
160 TInvertFunctor::Pointer invert_pixels = TInvertFunctor::New( );
161 invert_pixels->SetInput( danielsson->GetOutput( ) );
162 invert_pixels->Update( );
164 // Configure observer
165 TObserver::Pointer obs = TObserver::New( );
166 obs->SetImage( invert_pixels->GetOutput( ), window );
168 // Configure algorithm
169 TFrontAlgorithm::Pointer algorithm = TFrontAlgorithm::New( );
170 for( unsigned int s = 0; s < rep->GetNumberOfSeeds( ); s++ )
173 rep->GetSeedWorldPosition( s, pos );
175 TImage::PointType pnt;
179 TImage::IndexType idx;
180 if( input_image->TransformPhysicalPointToIndex( pnt, idx ) )
182 algorithm->AddSeed( idx, 0 );
183 std::cout << " Seed --> " << idx << std::endl;
188 algorithm->AddObserver( itk::AnyEvent( ), obs );
189 algorithm->ThrowEventsOn( );
190 algorithm->SetInput( invert_pixels->GetOutput( ) );
191 algorithm->SetNeighborhoodOrder( neighborhood_order );
192 algorithm->SetStopAtOneFront( stop_at_one_front );
193 algorithm->Update( );
195 // One last interaction
197 interactor->Start( );