#include #include #include #include #include #include #include #include #include // ------------------------------------------------------------------------- static const unsigned int VDim = 2; typedef short TPixel; typedef double TScalar; typedef itk::Image< TPixel, VDim > TImage; typedef itk::Image< TScalar, VDim > TScalarImage; typedef itk::ImageFileReader< TImage > TReader; typedef itk::ImageFileWriter< TScalarImage > TWriter; typedef fpa::Image::Dijkstra< TScalarImage, TScalarImage > TFilter; typedef itk::MinimumMaximumImageCalculator< TImage > TMinMax; typedef itk::SignedMaurerDistanceMapImageFilter< TImage, TScalarImage > TDMap; typedef TImage::IndexType TIndex; typedef fpa::Image::Functors::VertexIdentity< TScalarImage, TScalar > TVertexFunc; typedef fpa::Base::Functors::InvertValue< TScalar, TScalar > TValueFunc; typedef TFilter::TMST TMST; typedef itk::ImageFileWriter< TMST > TMSTWriter; typedef unsigned char TColorValue; typedef fpa::Image::MinimumSpanningTreeToImageFilter< TMST, TColorValue > TMSTToImage; typedef TMSTToImage::TOutputImage TColorImage; typedef itk::ImageFileWriter< TColorImage > TColorImageWriter; // ------------------------------------------------------------------------- int main( int argc, char* argv[] ) { // Get arguments if( argc < 5 + VDim ) { std::cerr << "Usage: " << argv[ 0 ] << " input_image output_image output_paths stop_at_one_front"; for( unsigned int i = 0; i < VDim; ++i ) std::cerr << " s_" << i; std::cerr << " ..." << std::endl; return( 1 ); } // fi std::string input_image_filename = argv[ 1 ]; std::string output_image_filename = argv[ 2 ]; std::string output_paths_filename = argv[ 3 ]; bool stop_at_one_front = ( std::atoi( argv[ 4 ] ) == 1 ); TReader::Pointer reader = TReader::New( ); reader->SetFileName( input_image_filename ); try { reader->Update( ); } catch( std::exception& err ) { std::cerr << "Error caught: " << err.what( ) << std::endl; return( 1 ); } // yrt TMinMax::Pointer minmax = TMinMax::New( ); minmax->SetImage( reader->GetOutput( ) ); minmax->Compute( ); TDMap::Pointer dmap = TDMap::New( ); dmap->SetInput( reader->GetOutput( ) ); dmap->SetBackgroundValue( minmax->GetMinimum( ) ); dmap->InsideIsPositiveOn( ); dmap->UseImageSpacingOn( ); dmap->SquaredDistanceOff( ); TFilter::Pointer filter = TFilter::New( ); filter->SetInput( dmap->GetOutput( ) ); filter->SetStopAtOneFront( stop_at_one_front ); for( int i = 5; i < argc; i += VDim ) { if( i + VDim <= argc ) { TImage::IndexType seed; for( int j = 0; j < VDim; ++j ) seed[ j ] = std::atoi( argv[ i + j ] ); filter->AddSeed( seed ); } // fi } // rof TVertexFunc::Pointer vertex_func = TVertexFunc::New( ); filter->SetFunctor( vertex_func ); TValueFunc::Pointer value_func = TValueFunc::New( ); value_func->SetAlpha( 1 ); value_func->SetBeta( 1 ); filter->SetFunctor( value_func ); TWriter::Pointer writer = TWriter::New( ); writer->SetInput( filter->GetOutput( ) ); writer->SetFileName( output_image_filename ); TMSTToImage::Pointer mst_image = TMSTToImage::New( ); mst_image->SetInput( filter->GetMinimumSpanningTree( ) ); TFilter::TSeedsInterface::TSeeds::const_iterator iseed = filter->BeginSeeds( ); TFilter::TSeedsInterface::TSeeds::const_iterator jseed; for( ; iseed != filter->EndSeeds( ); ++iseed ) for( jseed = filter->BeginSeeds( ); jseed != filter->EndSeeds( ); ++jseed ) mst_image->AddPath( *iseed, *jseed, 255, 0, 0 ); TColorImageWriter::Pointer paths_writer = TColorImageWriter::New( ); paths_writer->SetInput( mst_image->GetOutput( ) ); paths_writer->SetFileName( output_paths_filename ); try { writer->Update( ); paths_writer->Update( ); } catch( std::exception& err ) { std::cerr << "ERROR: " << err.what( ) << std::endl; return( 1 ); } // yrt return( 0 ); } // eof - $RCSfile$