]> Creatis software - FrontAlgorithms.git/blob - examples/Dijkstra_Maurer.cxx
...
[FrontAlgorithms.git] / examples / Dijkstra_Maurer.cxx
1 #include <itkImage.h>
2 #include <itkImageFileReader.h>
3 #include <itkImageFileWriter.h>
4 #include <itkMinimumMaximumImageCalculator.h>
5 #include <itkSignedMaurerDistanceMapImageFilter.h>
6
7 #include <fpa/Image/Dijkstra.h>
8 #include <fpa/Image/Functors/VertexIdentity.h>
9 #include <fpa/Base/Functors/InvertValue.h>
10
11 // -------------------------------------------------------------------------
12 static const unsigned int VDim = 2;
13 typedef short                                              TPixel;
14 typedef double                                             TScalar;
15 typedef itk::Image< TPixel, VDim >                         TImage;
16 typedef itk::Image< TScalar, VDim >                        TScalarImage;
17 typedef itk::ImageFileReader< TImage >                     TReader;
18 typedef itk::ImageFileWriter< TScalarImage >               TWriter;
19 typedef fpa::Image::Dijkstra< TScalarImage, TScalarImage > TFilter;
20 typedef itk::MinimumMaximumImageCalculator< TImage >       TMinMax;
21 typedef itk::SignedMaurerDistanceMapImageFilter< TImage, TScalarImage > TDMap;
22
23 typedef fpa::Image::Functors::VertexIdentity< TScalarImage, TScalar > TVertexFunc;
24 typedef fpa::Base::Functors::InvertValue< TScalar, TScalar > TValueFunc;
25
26 typedef TFilter::TMST                TMST;
27 typedef itk::ImageFileWriter< TMST > TMSTWriter;
28
29 // -------------------------------------------------------------------------
30 int main( int argc, char* argv[] )
31 {
32   // Get arguments
33   if( argc < 5 + VDim )
34   {
35     std::cerr
36       << "Usage: " << argv[ 0 ]
37       << " input_image output_image output_mst stop_at_one_front";
38     for( unsigned int i = 0; i < VDim; ++i )
39       std::cerr << " s_" << i;
40     std::cerr << " ..." << std::endl;
41     return( 1 );
42
43   } // fi
44   std::string input_image_filename = argv[ 1 ];
45   std::string output_image_filename = argv[ 2 ];
46   std::string output_mst_filename = argv[ 3 ];
47   bool stop_at_one_front = ( std::atoi( argv[ 4 ] ) == 1 );
48
49   TReader::Pointer reader = TReader::New( );
50   reader->SetFileName( input_image_filename );
51   try
52   {
53     reader->Update( );
54   }
55   catch( std::exception& err )
56   {
57     std::cerr << "Error caught: " << err.what( ) << std::endl;
58     return( 1 );
59
60   } // yrt
61
62   TMinMax::Pointer minmax = TMinMax::New( );
63   minmax->SetImage( reader->GetOutput( ) );
64   minmax->Compute( );
65
66   TDMap::Pointer dmap = TDMap::New( );
67   dmap->SetInput( reader->GetOutput( ) );
68   dmap->SetBackgroundValue( minmax->GetMinimum( ) );
69   dmap->InsideIsPositiveOn( );
70   dmap->UseImageSpacingOn( );
71   dmap->SquaredDistanceOff( );
72
73   TFilter::Pointer filter = TFilter::New( );
74   filter->SetInput( dmap->GetOutput( ) );
75   filter->SetStopAtOneFront( stop_at_one_front );
76
77   for( int i = 5; i < argc; i += VDim )
78   {
79     if( i + VDim <= argc )
80     {
81       TImage::IndexType seed;
82       for( int j = 0; j < VDim; ++j )
83         seed[ j ] = std::atoi( argv[ i + j ] );
84       filter->AddSeed( seed );
85
86     } // fi
87
88   } // rof
89
90   TVertexFunc::Pointer vertex_func = TVertexFunc::New( );
91   filter->SetFunctor( vertex_func );
92
93   TValueFunc::Pointer value_func = TValueFunc::New( );
94   value_func->SetAlpha( 1 );
95   value_func->SetBeta( 1 );
96   filter->SetFunctor( value_func );
97
98   TWriter::Pointer writer = TWriter::New( );
99   writer->SetInput( filter->GetOutput( ) );
100   writer->SetFileName( output_image_filename );
101
102   TMSTWriter::Pointer mst_writer = TMSTWriter::New( );
103   mst_writer->SetInput( filter->GetMinimumSpanningTree( ) );
104   mst_writer->SetFileName( output_mst_filename );
105
106   try
107   {
108     writer->Update( );
109     mst_writer->Update( );
110   }
111   catch( std::exception& err )
112   {
113     std::cerr << "ERROR: " << err.what( ) << std::endl;
114     return( 1 );
115
116   } // yrt
117   return( 0 );
118 }
119
120 // eof - $RCSfile$