]> Creatis software - FrontAlgorithms.git/blob - appli/CTBronchi/FastRandomWalker.cxx
...
[FrontAlgorithms.git] / appli / CTBronchi / FastRandomWalker.cxx
1 // =========================================================================
2 // @author Leonardo Florez Valencia
3 // @email florez-l@javeriana.edu.co
4 // =========================================================================
5
6 #include <string>
7 #include <tclap/CmdLine.h>
8 #include <itkBinaryThresholdImageFilter.h>
9 #include <itkImage.h>
10 #include <fpa/Filters/Image/RandomWalker.h>
11 #include <fpa/Functors/Dijkstra/Image/Gaussian.h>
12 #include "Functions.h"
13
14 // -------------------------------------------------------------------------
15 const unsigned int Dim = 3;
16 typedef short                                  TPixel;
17 typedef unsigned char                          TLabel;
18 typedef itk::NumericTraits< TPixel >::RealType TScalar;
19 typedef itk::Image< TPixel, Dim >              TImage;
20 typedef itk::Image< TLabel, Dim >              TLabels;
21
22 // -------------------------------------------------------------------------
23 int main( int argc, char* argv[] )
24 {
25   typedef TCLAP::ValueArg< std::string > _TStringArg;
26   typedef TCLAP::ValueArg< TScalar > _TRealArg;
27
28   // Parse input line
29   _TStringArg in( "i", "input", "Input image", true, "", "file" );
30   _TStringArg labels( "l", "labels", "Input labels", true, "", "file" );
31   _TStringArg out( "o", "output", "Output image", true, "", "file" );
32   _TRealArg beta( "b", "beta", "Beta", false, 2.5, "value (2.5)" );
33   _TRealArg eps( "e", "epsilon", "Epsilon", false, 1e-5, "value (1e-5)" );
34   try
35   {
36     TCLAP::CmdLine cmd( "FastRandomWalker", ' ', "1.0.0" );
37     cmd.add( eps );
38     cmd.add( beta );
39     cmd.add( out );
40     cmd.add( labels );
41     cmd.add( in );
42     cmd.parse( argc, argv );
43   }
44   catch( TCLAP::ArgException& err )
45   {
46     std::cerr
47       << "===============================" << std::endl
48       << "Error caught: " << std::endl
49       << err.error( ) << " " << err.argId( ) << std::endl
50       << "===============================" << std::endl
51       << std::endl;
52     return( 1 );
53
54   } // yrt
55
56   try
57   {
58     // Read input image
59     TImage::Pointer input_image;
60     CTBronchi::ReadImage( input_image, in.getValue( ) );
61
62     // Read input labels
63     TLabels::Pointer input_labels;
64     CTBronchi::ReadImage( input_labels, labels.getValue( ) );
65
66     // Prepare weight functor
67     typedef fpa::Functors::Dijkstra::Image::Gaussian< TImage, TScalar > TWeight;
68     TWeight::Pointer weight = TWeight::New( );
69     weight->SetBeta( beta.getValue( ) );
70     weight->SetEpsilon( eps.getValue( ) );
71
72     // Random walk
73     typedef fpa::Filters::Image::RandomWalker< TImage, TLabels, TScalar > TFilter;
74     TFilter::Pointer filter = TFilter::New( );
75     filter->SetInputImage( input_image );
76     filter->SetInputLabels( input_labels );
77     filter->SetWeightFunction( weight );
78     double t = CTBronchi::MeasureTime( filter );
79     std::cout << "FastRandomWalk executed in " << t << " s" << std::endl;
80
81     // Extract label
82     typedef itk::BinaryThresholdImageFilter< TLabels, TLabels > _TExtract;
83     typename _TExtract::Pointer extract = _TExtract::New( );
84     extract->SetInput( filter->GetOutputLabels( ) );
85     extract->SetInsideValue( 1 );
86     extract->SetOutsideValue( 0 );
87     extract->SetLowerThreshold( 1 );
88     extract->SetUpperThreshold( 1 );
89     t = CTBronchi::MeasureTime( extract );
90     std::cout << "Extract labels executed in " << t << " s" << std::endl;
91
92     // Write result
93     CTBronchi::WriteImage( extract->GetOutput( ), out.getValue( ) );
94   }
95   catch( std::exception& err )
96   {
97     std::cerr
98       << "===============================" << std::endl
99       << "Error caught: " << std::endl
100       << err.what( ) << std::endl
101       << "===============================" << std::endl
102       << std::endl;
103     return( 1 );
104
105   } // yrt
106   return( 0 );
107 }
108
109 // eof - $RCSfile$