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>
10 #include <fpa/Image/MinimumSpanningTreeToImageFilter.h>
12 // -------------------------------------------------------------------------
13 static const unsigned int VDim = 2;
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;
24 typedef TImage::IndexType TIndex;
26 typedef fpa::Image::Functors::VertexIdentity< TScalarImage, TScalar > TVertexFunc;
27 typedef fpa::Base::Functors::InvertValue< TScalar, TScalar > TValueFunc;
29 typedef TFilter::TMST TMST;
30 typedef itk::ImageFileWriter< TMST > TMSTWriter;
32 typedef unsigned char TColorValue;
33 typedef fpa::Image::MinimumSpanningTreeToImageFilter< TMST, TColorValue > TMSTToImage;
34 typedef TMSTToImage::TOutputImage TColorImage;
35 typedef itk::ImageFileWriter< TColorImage > TColorImageWriter;
37 // -------------------------------------------------------------------------
38 int main( int argc, char* argv[] )
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;
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 );
57 TReader::Pointer reader = TReader::New( );
58 reader->SetFileName( input_image_filename );
63 catch( std::exception& err )
65 std::cerr << "Error caught: " << err.what( ) << std::endl;
70 TMinMax::Pointer minmax = TMinMax::New( );
71 minmax->SetImage( reader->GetOutput( ) );
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( );
81 TFilter::Pointer filter = TFilter::New( );
82 filter->SetInput( dmap->GetOutput( ) );
83 filter->SetStopAtOneFront( stop_at_one_front );
85 for( int i = 5; i < argc; i += VDim )
87 if( i + VDim <= argc )
89 TImage::IndexType seed;
90 for( int j = 0; j < VDim; ++j )
91 seed[ j ] = std::atoi( argv[ i + j ] );
92 filter->AddSeed( seed );
98 TVertexFunc::Pointer vertex_func = TVertexFunc::New( );
99 filter->SetFunctor( vertex_func );
101 TValueFunc::Pointer value_func = TValueFunc::New( );
102 value_func->SetAlpha( 1 );
103 value_func->SetBeta( 1 );
104 filter->SetFunctor( value_func );
106 TWriter::Pointer writer = TWriter::New( );
107 writer->SetInput( filter->GetOutput( ) );
108 writer->SetFileName( output_image_filename );
110 TMSTToImage::Pointer mst_image = TMSTToImage::New( );
111 mst_image->SetInput( filter->GetMinimumSpanningTree( ) );
112 TFilter::TSeedsInterface::TSeeds::const_iterator iseed =
113 filter->BeginSeeds( );
114 TFilter::TSeedsInterface::TSeeds::const_iterator jseed;
115 for( ; iseed != filter->EndSeeds( ); ++iseed )
116 for( jseed = filter->BeginSeeds( ); jseed != filter->EndSeeds( ); ++jseed )
117 mst_image->AddPath( *iseed, *jseed, 255, 0, 0 );
119 TColorImageWriter::Pointer paths_writer = TColorImageWriter::New( );
120 paths_writer->SetInput( mst_image->GetOutput( ) );
121 paths_writer->SetFileName( output_paths_filename );
126 paths_writer->Update( );
128 catch( std::exception& err )
130 std::cerr << "ERROR: " << err.what( ) << std::endl;