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