1 // =========================================================================
2 // @author Leonardo Florez Valencia
3 // @email florez-l@javeriana.edu.co
4 // =========================================================================
8 #include <tclap/CmdLine.h>
10 #include <fpa/Filters/Image/Mori.h>
11 #include "Functions.h"
13 // -------------------------------------------------------------------------
14 const unsigned int Dim = 3;
16 typedef unsigned char TLabel;
17 typedef itk::Image< TPixel, Dim > TImage;
18 typedef itk::Image< TLabel, Dim > TLabels;
20 // -------------------------------------------------------------------------
21 int main( int argc, char* argv[] )
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;
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)" );
42 TCLAP::CmdLine cmd( "Mori segmentation", ' ', "1.0.0" );
46 cmd.add( sInfluence );
54 cmd.parse( argc, argv );
56 catch( TCLAP::ArgException& err )
59 << "===============================" << std::endl
60 << "Error caught: " << std::endl
61 << err.error( ) << " " << err.argId( )
62 << "===============================" << std::endl
69 std::istringstream sSeed( aSeed.getValue( ) );
70 TImage::PointType seed;
71 sSeed >> seed[ 0 ] >> seed[ 1 ] >> seed[ 2 ];
76 TImage::Pointer input_image;
77 CTBronchi::ReadImage( input_image, in.getValue( ) );
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( ) );
91 lower.getValue( ), upper.getValue( ), delta.getValue( )
93 double t = CTBronchi::MeasureTime( mori );
94 std::cout << "Mori executed in " << t << " s" << std::endl;
97 CTBronchi::WriteImage( mori->GetOutput( ), out.getValue( ) );
100 if( signal.getValue( ) != "" )
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 )
108 typename _TMori::TPeak p;
110 mori->GetSignalValues( j, x, y, p );
111 signalStr << x << " " << y << std::endl;
114 std::ofstream oStrSignals( signal.getValue( ).c_str( ) );
115 oStrSignals << signalStr.str( );
116 oStrSignals.close( );
120 catch( std::exception& err )
123 << "===============================" << std::endl
124 << "Error caught: " << std::endl
126 << "===============================" << std::endl