8 #include <itkImageFileReader.h>
9 #include <itkImageFileWriter.h>
10 #include <itkImageToVTKImageFilter.h>
12 #include <vtkImageActor.h>
13 #include <vtkImageMarchingCubes.h>
14 #include <vtkProperty.h>
15 #include <vtkRenderer.h>
16 #include <vtkRenderWindow.h>
17 #include <vtkRenderWindowInteractor.h>
18 #include <vtkSmartPointer.h>
19 #include <vtkSphereSource.h>
21 #include <fpa/Image/RegionGrowWithMultipleThresholds.h>
22 #include <fpa/VTK/ImageMPR.h>
23 #include <fpa/VTK/Image3DObserver.h>
25 // -------------------------------------------------------------------------
26 const unsigned int Dim = 3;
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 itk::ImageFileWriter< TImage > TImageWriter;
36 fpa::Image::RegionGrowWithMultipleThresholds< TImage >
39 fpa::VTK::Image3DObserver< TFrontAlgorithm, vtkRenderWindow >
42 // -------------------------------------------------------------------------
43 int main( int argc, char* argv[] )
48 << "Usage: " << argv[ 0 ]
49 << " input_image thr_0 thr_1 step output_image"
55 std::string input_image_fn = argv[ 1 ];
56 TPixel thr_0 = TPixel( std::atof( argv[ 2 ] ) );
57 TPixel thr_1 = TPixel( std::atof( argv[ 3 ] ) );
58 unsigned int step = std::atoi( argv[ 4 ] );
59 std::string output_image_fn = argv[ 5 ];
60 bool visual_debug = false;
62 visual_debug = ( std::atoi( argv[ 6 ] ) == 1 );
65 TImageReader::Pointer input_image_reader = TImageReader::New( );
66 input_image_reader->SetFileName( input_image_fn );
69 input_image_reader->Update( );
71 catch( itk::ExceptionObject& err )
73 std::cerr << "Error caught: " << err << std::endl;
77 TImage::ConstPointer input_image = input_image_reader->GetOutput( );
78 TImage::SpacingType spac = input_image->GetSpacing( );
79 double min_spac = spac[ 0 ];
80 for( unsigned int d = 1; d < Dim; d++ )
81 min_spac = ( spac[ d ] < min_spac )? spac[ d ]: min_spac;
83 TVTKImage::Pointer vtk_image = TVTKImage::New( );
84 vtk_image->SetInput( input_image );
87 fpa::VTK::ImageMPR view;
88 view.SetBackground( 0.3, 0.2, 0.8 );
89 view.SetSize( 800, 800 );
90 view.SetImage( vtk_image->GetOutput( ) );
92 // Wait for a seed to be given
93 while( view.GetNumberOfSeeds( ) == 0 )
98 view.GetSeed( 0, seed );
99 TImage::PointType seed_pnt;
100 seed_pnt[ 0 ] = seed[ 0 ];
101 seed_pnt[ 1 ] = seed[ 1 ];
102 seed_pnt[ 2 ] = seed[ 2 ];
103 TImage::IndexType seed_idx;
104 input_image->TransformPhysicalPointToIndex( seed_pnt, seed_idx );
106 // Configure algorithm
107 TFrontAlgorithm::Pointer algorithm = TFrontAlgorithm::New( );
108 algorithm->AddThresholds( thr_0, thr_1, step );
109 algorithm->AddSeed( seed_idx, 0 );
110 algorithm->SetInput( input_image );
111 algorithm->SetNeighborhoodOrder( 1 );
112 algorithm->SetDifferenceThreshold( double( 3 ) );
116 // Configure observer
117 TObserver::Pointer obs = TObserver::New( );
118 obs->SetImage( input_image, view.GetWindow( ) );
119 algorithm->AddObserver( itk::AnyEvent( ), obs );
120 algorithm->ThrowEventsOn( );
123 algorithm->ThrowEventsOff( );
125 std::clock_t start = std::clock( );
126 algorithm->Update( );
127 std::clock_t end = std::clock( );
128 double seconds = double( end - start ) / double( CLOCKS_PER_SEC );
129 std::cout << "Execution time = " << seconds << std::endl;
132 TVTKImage::Pointer output_image_vtk = TVTKImage::New( );
133 output_image_vtk->SetInput( algorithm->GetOutput( ) );
134 output_image_vtk->Update( );
136 vtkSmartPointer< vtkImageMarchingCubes > mc =
137 vtkSmartPointer< vtkImageMarchingCubes >::New( );
138 mc->SetInputData( output_image_vtk->GetOutput( ) );
141 double( algorithm->GetInsideValue( ) ) * double( 0.95 )
145 // Let some interaction and close program
146 view.AddPolyData( mc->GetOutput( ), 0.1, 0.6, 0.8, 0.5 );
149 // Write resulting image
150 TImageWriter::Pointer output_image_writer = TImageWriter::New( );
151 output_image_writer->SetInput( algorithm->GetOutput( ) );
152 output_image_writer->SetFileName( output_image_fn );
155 output_image_writer->Update( );
157 catch( itk::ExceptionObject& err )
159 std::cerr << "Error caught: " << err << std::endl;