// ========================================================================= // @author Leonardo Florez Valencia // @email florez-l@javeriana.edu.co // ========================================================================= #include #include #include #include #include #include "Functions.h" // ------------------------------------------------------------------------- const unsigned int Dim = 3; typedef short TPixel; typedef unsigned char TLabel; typedef itk::Image< TPixel, Dim > TImage; typedef itk::Image< TLabel, Dim > TLabels; // ------------------------------------------------------------------------- int main( int argc, char* argv[] ) { typedef TCLAP::ValueArg< std::string > _TStringArg; typedef TCLAP::ValueArg< double > _TRealArg; typedef TCLAP::ValueArg< unsigned long > _TUIntArg; typedef TCLAP::ValueArg< TPixel > _TPixelArg; // Parse input line _TStringArg in( "i", "input", "Input image", true, "", "file" ); _TStringArg out( "o", "output", "Output image", true, "", "file" ); _TStringArg signal( "s", "signal", "Output signal", false, "", "file" ); _TStringArg aSeed( "p", "seed", "Input seed", true, "", "\"x y z\"" ); _TPixelArg mThr( "t", "min_thr", "Minimum threshold", false, -850, "value (-850)" ); _TUIntArg sKernel( "k", "kernel", "Kernel size", false, 20, "value (20)" ); _TRealArg sThr( "r", "signal_thr", "Signal threshold", false, 100, "value (100)" ); _TRealArg sInfluence( "f", "signal_influence", "Signal influence", false, 0.5, "value (0.5)" ); _TPixelArg lower( "l", "lower", "Lower threshold", false, -1024, "value (-1024)" ); _TPixelArg upper( "u", "upper", "Upper threshold", false, 0, "value (0)" ); _TPixelArg delta( "d", "delta", "Delta threshold", false, 1, "value (1)" ); try { TCLAP::CmdLine cmd( "Mori segmentation", ' ', "1.0.0" ); cmd.add( delta ); cmd.add( upper ); cmd.add( lower ); cmd.add( sInfluence ); cmd.add( sThr ); cmd.add( sKernel ); cmd.add( mThr ); cmd.add( aSeed ); cmd.add( signal ); cmd.add( out ); cmd.add( in ); cmd.parse( argc, argv ); } catch( TCLAP::ArgException& err ) { std::cerr << "===============================" << std::endl << "Error caught: " << std::endl << err.error( ) << " " << err.argId( ) << "===============================" << std::endl << std::endl; return( 1 ); } // yrt // Get seed std::istringstream sSeed( aSeed.getValue( ) ); TImage::PointType seed; sSeed >> seed[ 0 ] >> seed[ 1 ] >> seed[ 2 ]; try { // Read image TImage::Pointer input_image; CTBronchi::ReadImage( input_image, in.getValue( ) ); // Mori segmentation typedef fpa::Filters::Image::Mori< TImage, TLabels > _TMori; _TMori::Pointer mori = _TMori::New( ); mori->SetInput( input_image ); mori->SetSeed( seed ); mori->SetInsideValue( 1 ); mori->SetOutsideValue( 0 ); mori->SetMinimumThreshold( mThr.getValue( ) ); mori->SetSignalKernelSize( sKernel.getValue( ) ); mori->SetSignalThreshold( sThr.getValue( ) ); mori->SetSignalInfluence( sInfluence.getValue( ) ); mori->SetThresholds( lower.getValue( ), upper.getValue( ), delta.getValue( ) ); double t = CTBronchi::MeasureTime( mori ); std::cout << "Mori executed in " << t << " s" << std::endl; // Write result CTBronchi::WriteImage( mori->GetOutput( ), out.getValue( ) ); // Write signal if( signal.getValue( ) != "" ) { std::stringstream signalStr; unsigned long nthr = mori->GetNumberOfEvaluatedThresholds( ); signalStr << "# nThr = " << nthr << std::endl; signalStr << "# Opt = " << mori->GetOptimumThreshold( ) << std::endl; for( unsigned long j = 0; j < nthr; ++j ) { typename _TMori::TPeak p; double x, y; mori->GetSignalValues( j, x, y, p ); signalStr << x << " " << y << std::endl; } // rof std::ofstream oStrSignals( signal.getValue( ).c_str( ) ); oStrSignals << signalStr.str( ); oStrSignals.close( ); } // fi } catch( std::exception& err ) { std::cerr << "===============================" << std::endl << "Error caught: " << std::endl << err.what( ) << "===============================" << std::endl << std::endl; return( 1 ); } // yrt return( 0 ); } // eof - $RCSfile$