2 #include <itkImageFileReader.h>
3 #include <itkImageFileWriter.h>
4 #include <itkMinimumMaximumImageCalculator.h>
5 #include <itkSignedMaurerDistanceMapImageFilter.h>
7 #include <fpa/Image/Dijkstra.h>
8 #include <fpa/Image/Functors/VertexIdentity.h>
9 #include <fpa/Base/Functors/InvertValue.h>
11 // -------------------------------------------------------------------------
12 static const unsigned int VDim = 2;
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;
23 typedef fpa::Image::Functors::VertexIdentity< TScalarImage, TScalar > TVertexFunc;
24 typedef fpa::Base::Functors::InvertValue< TScalar, TScalar > TValueFunc;
26 typedef TFilter::TMST TMST;
27 typedef itk::ImageFileWriter< TMST > TMSTWriter;
29 // -------------------------------------------------------------------------
30 int main( int argc, char* argv[] )
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;
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 );
49 TReader::Pointer reader = TReader::New( );
50 reader->SetFileName( input_image_filename );
55 catch( std::exception& err )
57 std::cerr << "Error caught: " << err.what( ) << std::endl;
62 TMinMax::Pointer minmax = TMinMax::New( );
63 minmax->SetImage( reader->GetOutput( ) );
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( );
73 TFilter::Pointer filter = TFilter::New( );
74 filter->SetInput( dmap->GetOutput( ) );
75 filter->SetStopAtOneFront( stop_at_one_front );
77 for( int i = 5; i < argc; i += VDim )
79 if( i + VDim <= argc )
81 TImage::IndexType seed;
82 for( int j = 0; j < VDim; ++j )
83 seed[ j ] = std::atoi( argv[ i + j ] );
84 filter->AddSeed( seed );
90 TVertexFunc::Pointer vertex_func = TVertexFunc::New( );
91 filter->SetFunctor( vertex_func );
93 TValueFunc::Pointer value_func = TValueFunc::New( );
94 value_func->SetAlpha( 1 );
95 value_func->SetBeta( 1 );
96 filter->SetFunctor( value_func );
98 TWriter::Pointer writer = TWriter::New( );
99 writer->SetInput( filter->GetOutput( ) );
100 writer->SetFileName( output_image_filename );
102 TMSTWriter::Pointer mst_writer = TMSTWriter::New( );
103 mst_writer->SetInput( filter->GetMinimumSpanningTree( ) );
104 mst_writer->SetFileName( output_mst_filename );
109 mst_writer->Update( );
111 catch( std::exception& err )
113 std::cerr << "ERROR: " << err.what( ) << std::endl;