]> Creatis software - FrontAlgorithms.git/blob - examples/SkeletonFilter.cxx
...
[FrontAlgorithms.git] / examples / SkeletonFilter.cxx
1
2 #include <chrono>
3 #include <iomanip>
4 #include <itkImage.h>
5 #include <itkImageFileReader.h>
6
7 #include <fpa/Base/SkeletonWriter.h>
8 #include <fpa/Image/SkeletonFilter.h>
9
10 // -------------------------------------------------------------------------
11 static const unsigned int VDim = 3;
12 typedef unsigned char                                   TPixel;
13 typedef double                                          TScalar;
14 typedef itk::Image< TPixel, VDim >                      TImage;
15 typedef itk::ImageFileReader< TImage >                  TReader;
16 typedef fpa::Image::SkeletonFilter< TImage, TScalar >   TFilter;
17 typedef fpa::Base::SkeletonWriter< TFilter::TSkeleton > TWriter;
18
19 // -------------------------------------------------------------------------
20 int main( int argc, char* argv[] )
21 {
22   // Get arguments
23   if( argc != 3 && argc != 3 + VDim )
24   {
25     std::cerr
26       << "Usage: " << argv[ 0 ]
27       << " input_image output_skeleton [";
28     for( unsigned int i = 0; i < VDim; ++i )
29       std::cerr << " s_" << i;
30     std::cerr << " ]" << std::endl;
31     return( 1 );
32
33   } // fi
34   std::string input_image_filename = argv[ 1 ];
35   std::string output_skeleton_filename = argv[ 2 ];
36
37   TReader::Pointer reader = TReader::New( );
38   reader->SetFileName( input_image_filename );
39   try
40   {
41     reader->Update( );
42   }
43   catch( std::exception& err )
44   {
45     std::cerr << "ERROR: " << err.what( ) << std::endl;
46     return( 1 );
47
48   } // yrt
49
50   TFilter::Pointer filter = TFilter::New( );
51   filter->SetInput( reader->GetOutput( ) );
52
53   if( argc > 3 )
54   {
55     filter->SeedFromMaximumDistanceOff( );
56     TImage::PointType pnt;
57     for( int i = 0; i < VDim; ++i )
58       pnt[ i ] = std::atof( argv[ i + 3 ] );
59     TImage::IndexType seed;
60     if( !( reader->GetOutput( )->TransformPhysicalPointToIndex( pnt, seed ) ) )
61     {
62       std::cerr << "ERROR: seed outside image." << std::endl;
63       return( 1 );
64
65     } // fi
66     filter->AddSeed( seed );
67   }
68   else
69     filter->SeedFromMaximumDistanceOn( );
70
71   std::chrono::time_point< std::chrono::system_clock > start, end;
72   start = std::chrono::system_clock::now( );
73   filter->Update( );
74   end = std::chrono::system_clock::now( );
75   std::chrono::duration< double > elapsed_seconds = end - start;
76
77   TWriter::Pointer writer = TWriter::New( );
78   writer->SetInput( filter->GetSkeleton( ) );
79   writer->SetFileName( output_skeleton_filename );
80   try
81   {
82     writer->Update( );
83   }
84   catch( std::exception& err )
85   {
86     std::cerr << "ERROR: " << err.what( ) << std::endl;
87     return( 1 );
88
89   } // yrt
90
91   // Show data
92   std::cout << "Time: " << elapsed_seconds.count( ) << "s" << std::endl;
93   return( 0 );
94 }
95
96 // eof - $RCSfile$