]> Creatis software - FrontAlgorithms.git/blob - appli/CTBronchi/MoriSegmentation.cxx
...
[FrontAlgorithms.git] / appli / CTBronchi / MoriSegmentation.cxx
1 // =========================================================================
2 // @author Leonardo Florez Valencia
3 // @email florez-l@javeriana.edu.co
4 // =========================================================================
5
6 #include <sstream>
7 #include <string>
8 #include <tclap/CmdLine.h>
9 #include <itkImage.h>
10 #include <fpa/Filters/Image/Mori.h>
11 #include "Functions.h"
12
13 // -------------------------------------------------------------------------
14 const unsigned int Dim = 3;
15 typedef short                     TPixel;
16 typedef unsigned char             TLabel;
17 typedef itk::Image< TPixel, Dim > TImage;
18 typedef itk::Image< TLabel, Dim > TLabels;
19
20 // -------------------------------------------------------------------------
21 int main( int argc, char* argv[] )
22 {
23   typedef TCLAP::ValueArg< std::string >   _TStringArg;
24   typedef TCLAP::ValueArg< double >        _TRealArg;
25   typedef TCLAP::ValueArg< unsigned long > _TUIntArg;
26   typedef TCLAP::ValueArg< TPixel >        _TPixelArg;
27
28   // Parse input line
29   _TStringArg in( "i", "input", "Input image", true, "", "file" );
30   _TStringArg out( "o", "output", "Output image", true, "", "file" );
31   _TStringArg signal( "s", "signal", "Output signal", false, "", "file" );
32   _TStringArg aSeed( "p", "seed", "Input seed", true, "", "\"x y z\"" );
33   _TPixelArg mThr( "t", "min_thr", "Minimum threshold", false, -850, "value (-850)" );
34   _TUIntArg sKernel( "k", "kernel", "Kernel size", false, 20, "value (20)" );
35   _TRealArg sThr( "r", "signal_thr", "Signal threshold", false, 100, "value (100)" );
36   _TRealArg sInfluence( "f", "signal_influence", "Signal influence", false, 0.5, "value (0.5)" );
37   _TPixelArg lower( "l", "lower", "Lower threshold", false, -1024, "value (-1024)" );
38   _TPixelArg upper( "u", "upper", "Upper threshold", false, 0, "value (0)" );
39   _TPixelArg delta( "d", "delta", "Delta threshold", false, 1, "value (1)" );
40   try
41   {
42     TCLAP::CmdLine cmd( "Mori segmentation", ' ', "1.0.0" );
43     cmd.add( delta );
44     cmd.add( upper );
45     cmd.add( lower );
46     cmd.add( sInfluence );
47     cmd.add( sThr );
48     cmd.add( sKernel );
49     cmd.add( mThr );
50     cmd.add( aSeed );
51     cmd.add( signal );
52     cmd.add( out );
53     cmd.add( in );
54     cmd.parse( argc, argv );
55   }
56   catch( TCLAP::ArgException& err )
57   {
58     std::cerr
59       << "===============================" << std::endl
60       << "Error caught: " << std::endl
61       << err.error( ) << " " << err.argId( )
62       << "===============================" << std::endl
63       << std::endl;
64     return( 1 );
65
66   } // yrt
67
68   // Get seed
69   std::istringstream sSeed( aSeed.getValue( ) );
70   TImage::PointType seed;
71   sSeed >> seed[ 0 ] >> seed[ 1 ] >> seed[ 2 ];
72
73   try
74   {
75     // Read image
76     TImage::Pointer input_image;
77     CTBronchi::ReadImage( input_image, in.getValue( ) );
78
79     // Mori segmentation
80     typedef fpa::Filters::Image::Mori< TImage, TLabels > _TMori;
81     _TMori::Pointer mori = _TMori::New( );
82     mori->SetInput( input_image );
83     mori->SetSeed( seed );
84     mori->SetInsideValue( 1 );
85     mori->SetOutsideValue( 0 );
86     mori->SetMinimumThreshold( mThr.getValue( ) );
87     mori->SetSignalKernelSize( sKernel.getValue( ) );
88     mori->SetSignalThreshold( sThr.getValue( ) );
89     mori->SetSignalInfluence( sInfluence.getValue( ) );
90     mori->SetThresholds(
91       lower.getValue( ), upper.getValue( ), delta.getValue( )
92       );
93     double t = CTBronchi::MeasureTime( mori );
94     std::cout << "Mori executed in " << t << " s" << std::endl;
95
96     // Write result
97     CTBronchi::WriteImage( mori->GetOutput( ), out.getValue( ) );
98
99     // Write signal
100     if( signal.getValue( ) != "" )
101     {
102       std::stringstream signalStr;
103       unsigned long nthr = mori->GetNumberOfEvaluatedThresholds( );
104       signalStr << "# nThr = " << nthr << std::endl;
105       signalStr << "# Opt  = " << mori->GetOptimumThreshold( ) << std::endl;
106       for( unsigned long j = 0; j < nthr; ++j )
107       {
108         typename _TMori::TPeak p;
109         double x, y;
110         mori->GetSignalValues( j, x, y, p );
111         signalStr << x << " " << y << std::endl;
112
113       } // rof
114       std::ofstream oStrSignals( signal.getValue( ).c_str( ) );
115       oStrSignals << signalStr.str( );
116       oStrSignals.close( );
117
118     } // fi
119   }
120   catch( std::exception& err )
121   {
122     std::cerr
123       << "===============================" << std::endl
124       << "Error caught: " << std::endl
125       << err.what( )
126       << "===============================" << std::endl
127       << std::endl;
128     return( 1 );
129
130   } // yrt
131   return( 0 );
132 }
133
134 // eof - $RCSfile$