#include <string>
#include <tclap/CmdLine.h>
#include <itkImage.h>
-#include "MoriLabelling.h"
+#include <fpa/Filters/Image/RandomWalker.h>
+#include <fpa/Functors/Dijkstra/Image/Gaussian.h>
#include "Functions.h"
// -------------------------------------------------------------------------
typedef itk::NumericTraits< TPixel >::RealType TScalar;
typedef itk::Image< TPixel, Dim > TImage;
typedef itk::Image< TLabel, Dim > TLabels;
-typedef itk::Image< TScalar, Dim > TScalarImage;
// -------------------------------------------------------------------------
int main( int argc, char* argv[] )
{
typedef TCLAP::ValueArg< std::string > _TStringArg;
- typedef TCLAP::ValueArg< double > _TRealArg;
- typedef TCLAP::ValueArg< TPixel > _TPixelArg;
+ typedef TCLAP::ValueArg< TScalar > _TRealArg;
// Parse input line
_TStringArg in( "i", "input", "Input image", true, "", "file" );
_TStringArg labels( "l", "labels", "Input labels", true, "", "file" );
- _TStringArg vesselness( "v", "vesselness", "Input vesselness", true, "", "file" );
_TStringArg out( "o", "output", "Output image", true, "", "file" );
- _TRealArg vThr( "a", "vesselness_thr", "Vesselness threshold", false, 0.05, "value (0.05)" );
- _TPixelArg uThr( "u", "upper_thr", "Upper threshold", false, -400, "value (-400)" );
+ _TRealArg beta( "b", "beta", "Beta", false, 2.5, "value (2.5)" );
+ _TRealArg eps( "e", "epsilon", "Epsilon", false, 1e-5, "value (1e-5)" );
try
{
- TCLAP::CmdLine cmd( "Labelling", ' ', "1.0.0" );
- cmd.add( uThr );
- cmd.add( vThr );
+ TCLAP::CmdLine cmd( "FastRandomWalker", ' ', "1.0.0" );
+ cmd.add( eps );
+ cmd.add( beta );
cmd.add( out );
- cmd.add( vesselness );
cmd.add( labels );
cmd.add( in );
cmd.parse( argc, argv );
TLabels::Pointer input_labels;
CTBronchi::ReadImage( input_labels, labels.getValue( ) );
- // Read input vesselness
- TScalarImage::Pointer input_vesselness;
- CTBronchi::ReadImage( input_vesselness, vesselness.getValue( ) );
+ // Prepare weight functor
+ typedef fpa::Functors::Dijkstra::Image::Gaussian< TImage, TScalar > TWeight;
+ TWeight::Pointer weight = TWeight::New( );
+ weight->SetBeta( beta.getValue( ) );
+ weight->SetEpsilon( eps.getValue( ) );
- // Create labels
- typedef CTBronchi::MoriLabelling< TImage, TLabels, TScalarImage > _TLabelling;
- _TLabelling::Pointer labelling = _TLabelling::New( );
- labelling->SetInput( input_image );
- labelling->SetInputLabels( input_labels );
- labelling->SetInputVesselness( input_vesselness );
- labelling->SetVesselnessThreshold( vThr.getValue( ) );
- labelling->SetUpperThreshold( uThr.getValue( ) );
- labelling->SetInsideValue( 1 );
- labelling->SetOutsideValue( 2 );
- labelling->SetFillValue( 2 );
- double t = CTBronchi::MeasureTime( labelling );
- std::cout << "Labelling executed in " << t << " s" << std::endl;
+ // Random walk
+ typedef fpa::Filters::Image::RandomWalker< TImage, TLabels, TScalar > TFilter;
+ TFilter::Pointer filter = TFilter::New( );
+ filter->SetInputImage( input_image );
+ filter->SetInputLabels( input_labels );
+ filter->SetWeightFunction( weight );
+ double t = CTBronchi::MeasureTime( filter );
+ std::cout << "FastRandomWalk executed in " << t << " s" << std::endl;
// Write result
- CTBronchi::WriteImage( labelling->GetOutput( ), out.getValue( ) );
+ CTBronchi::WriteImage( filter->GetOutputLabels( ), out.getValue( ) );
}
catch( std::exception& err )
{