6 #include <itkImageFileReader.h>
7 #include <itkRGBAPixel.h>
8 #include <itkSignedDanielssonDistanceMapImageFilter.h>
9 #include <itkImageToVTKImageFilter.h>
11 #include <vtkImageActor.h>
12 #include <vtkInteractorStyleImage.h>
13 #include <vtkPointHandleRepresentation3D.h>
14 #include <vtkProperty.h>
15 #include <vtkRenderer.h>
16 #include <vtkRenderWindow.h>
17 #include <vtkRenderWindowInteractor.h>
18 #include <vtkSeedRepresentation.h>
19 #include <vtkSeedWidget.h>
20 #include <vtkSmartPointer.h>
22 #include <fpa/Image/Dijkstra.h>
23 #include <fpa/Base/Functors/InvertCostFunction.h>
24 #include <fpa/Base/TreeExtractor.h>
25 #include <fpa/VTK/Image2DObserver.h>
27 // -------------------------------------------------------------------------
28 const unsigned int Dim = 2;
29 typedef unsigned char TPixel;
30 typedef itk::RGBAPixel< TPixel > TRGBAPixel;
31 typedef double TScalar;
32 typedef itk::Image< TPixel, Dim > TImage;
33 typedef itk::Image< TScalar, Dim > TDistanceMap;
34 typedef itk::Image< TRGBAPixel, Dim > TRGBAImage;
35 typedef itk::ImageToVTKImageFilter< TImage > TVTKImage;
36 typedef itk::ImageToVTKImageFilter< TRGBAImage > TVTKRGBAImage;
38 typedef itk::ImageFileReader< TImage > TImageReader;
40 itk::SignedDanielssonDistanceMapImageFilter< TImage, TDistanceMap >
43 typedef fpa::Image::Dijkstra< TDistanceMap, TScalar > TFrontAlgorithm;
44 typedef fpa::Base::TreeExtractor< TFrontAlgorithm > TExtractor;
45 typedef fpa::Base::Functors::InvertCostFunction< TScalar > TScalarFunction;
48 fpa::VTK::Image2DObserver< TExtractor, vtkRenderWindow >
51 // -------------------------------------------------------------------------
52 int main( int argc, char* argv[] )
57 << "Usage: " << argv[ 0 ]
58 << " input_image [stop_at_one_front]" << std::endl;
62 std::string input_image_fn = argv[ 1 ];
63 bool stop_at_one_front = false;
65 stop_at_one_front = ( std::atoi( argv[ 2 ] ) == 1 );
68 TImageReader::Pointer input_image_reader = TImageReader::New( );
69 input_image_reader->SetFileName( input_image_fn );
72 input_image_reader->Update( );
74 catch( itk::ExceptionObject& err )
76 std::cerr << "Error caught: " << err << std::endl;
81 TDistanceFilter::Pointer dist_filter = TDistanceFilter::New( );
82 dist_filter->SetInput( input_image_reader->GetOutput( ) );
83 dist_filter->InsideIsPositiveOn( );
84 dist_filter->SquaredDistanceOff( );
85 dist_filter->Update( );
87 TImage::ConstPointer input_image = input_image_reader->GetOutput( );
89 TVTKImage::Pointer vtk_image = TVTKImage::New( );
90 vtk_image->SetInput( input_image );
94 vtkSmartPointer< vtkImageActor > actor =
95 vtkSmartPointer< vtkImageActor >::New( );
96 actor->SetInputData( vtk_image->GetOutput( ) );
98 vtkSmartPointer< vtkRenderer > renderer =
99 vtkSmartPointer< vtkRenderer >::New( );
100 renderer->SetBackground( 0.1, 0.2, 0.7 );
101 renderer->AddActor( actor );
102 vtkSmartPointer< vtkRenderWindow > window =
103 vtkSmartPointer< vtkRenderWindow >::New( );
104 window->SetSize( 800, 800 );
105 window->AddRenderer( renderer );
108 vtkSmartPointer< vtkInteractorStyleImage > imageStyle =
109 vtkSmartPointer< vtkInteractorStyleImage >::New( );
110 vtkSmartPointer< vtkRenderWindowInteractor > interactor =
111 vtkSmartPointer< vtkRenderWindowInteractor >::New( );
112 interactor->SetInteractorStyle( imageStyle );
113 window->SetInteractor( interactor );
116 // Create the widget and its representation
117 vtkSmartPointer< vtkPointHandleRepresentation3D > handle =
118 vtkSmartPointer< vtkPointHandleRepresentation3D >::New( );
119 handle->GetProperty( )->SetColor( 1, 0, 0 );
120 vtkSmartPointer< vtkSeedRepresentation > rep =
121 vtkSmartPointer< vtkSeedRepresentation >::New( );
122 rep->SetHandleRepresentation( handle );
124 vtkSmartPointer< vtkSeedWidget > widget =
125 vtkSmartPointer< vtkSeedWidget >::New( );
126 widget->SetInteractor( interactor );
127 widget->SetRepresentation( rep );
129 // Let some interaction
130 interactor->Initialize( );
133 interactor->Start( );
135 // Configure observer
136 TObserver::Pointer obs = TObserver::New( );
137 obs->SetImage( dist_filter->GetOutput( ), window );
139 // Configure membership function
140 TScalarFunction::Pointer cost_function = TScalarFunction::New( );
142 // Configure algorithm
143 TExtractor::Pointer algorithm = TExtractor::New( );
144 for( unsigned int s = 0; s < rep->GetNumberOfSeeds( ); s++ )
147 rep->GetSeedWorldPosition( s, pos );
149 TImage::PointType pnt;
153 TImage::IndexType idx;
154 if( input_image->TransformPhysicalPointToIndex( pnt, idx ) )
156 algorithm->AddSeed( idx, 0 );
158 algorithm->SetRoot( idx );
160 algorithm->AddLeaf( idx );
165 algorithm->AddObserver( itk::AnyEvent( ), obs );
166 algorithm->ThrowEventsOn( );
167 algorithm->SetInput( dist_filter->GetOutput( ) );
168 algorithm->SetNeighborhoodOrder( 1 );
169 algorithm->SetStopAtOneFront( stop_at_one_front );
170 algorithm->SetCostConversion( cost_function );
171 algorithm->Update( );
173 // Create image with tree
174 TPixel transparent_color[] = { 0, 0, 0, 0 };
175 TPixel solid_color[] = { 255, 255, 0, 255 };
176 TRGBAImage::Pointer tree_image = TRGBAImage::New( );
177 tree_image->CopyInformation( input_image );
178 tree_image->SetRequestedRegionToLargestPossibleRegion( );
179 tree_image->SetBufferedRegion( tree_image->GetRequestedRegion( ) );
180 tree_image->Allocate( );
181 tree_image->FillBuffer( TRGBAPixel( transparent_color ) );
183 const TExtractor::TTree& tree = algorithm->GetTree( );
184 TExtractor::TTree::const_iterator tIt = tree.begin( );
185 for( ; tIt != tree.end( ); ++tIt )
186 tree_image->SetPixel( tIt->first, TRGBAPixel( solid_color ) );
188 TVTKRGBAImage::Pointer vtk_tree_image = TVTKRGBAImage::New( );
189 vtk_tree_image->SetInput( tree_image );
190 vtk_tree_image->Update( );
192 vtkSmartPointer< vtkImageActor > tree_actor =
193 vtkSmartPointer< vtkImageActor >::New( );
194 tree_actor->SetInputData( vtk_tree_image->GetOutput( ) );
196 renderer->AddActor( tree_actor );
199 // One last interaction
200 interactor->Start( );