#include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include // ------------------------------------------------------------------------- const unsigned int Dim = 2; typedef unsigned char TPixel; typedef itk::RGBAPixel< TPixel > TRGBAPixel; typedef double TScalar; typedef itk::Image< TPixel, Dim > TImage; typedef itk::Image< TScalar, Dim > TDistanceMap; typedef itk::Image< TRGBAPixel, Dim > TRGBAImage; typedef itk::ImageToVTKImageFilter< TImage > TVTKImage; typedef itk::ImageToVTKImageFilter< TRGBAImage > TVTKRGBAImage; typedef itk::ImageFileReader< TImage > TImageReader; typedef itk::SignedDanielssonDistanceMapImageFilter< TImage, TDistanceMap > TDistanceFilter; typedef fpa::Image::Dijkstra< TDistanceMap, TScalar > TFrontAlgorithm; typedef fpa::Base::TreeExtractor< TFrontAlgorithm > TExtractor; typedef fpa::Base::Functors::InvertCostFunction< TScalar > TScalarFunction; typedef fpa::VTK::Image2DObserver< TExtractor, vtkRenderWindow > TObserver; // ------------------------------------------------------------------------- int main( int argc, char* argv[] ) { if( argc < 2 ) { std::cerr << "Usage: " << argv[ 0 ] << " input_image [stop_at_one_front]" << std::endl; return( 1 ); } // fi std::string input_image_fn = argv[ 1 ]; bool stop_at_one_front = false; if( 2 < argc ) stop_at_one_front = ( std::atoi( argv[ 2 ] ) == 1 ); // Read image TImageReader::Pointer input_image_reader = TImageReader::New( ); input_image_reader->SetFileName( input_image_fn ); try { input_image_reader->Update( ); } catch( itk::ExceptionObject& err ) { std::cerr << "Error caught: " << err << std::endl; return( 1 ); } // yrt TDistanceFilter::Pointer dist_filter = TDistanceFilter::New( ); dist_filter->SetInput( input_image_reader->GetOutput( ) ); dist_filter->InsideIsPositiveOn( ); dist_filter->SquaredDistanceOff( ); dist_filter->Update( ); TImage::ConstPointer input_image = input_image_reader->GetOutput( ); TVTKImage::Pointer vtk_image = TVTKImage::New( ); vtk_image->SetInput( input_image ); vtk_image->Update( ); // VTK visualization vtkSmartPointer< vtkImageActor > actor = vtkSmartPointer< vtkImageActor >::New( ); actor->SetInputData( vtk_image->GetOutput( ) ); vtkSmartPointer< vtkRenderer > renderer = vtkSmartPointer< vtkRenderer >::New( ); renderer->SetBackground( 0.1, 0.2, 0.7 ); renderer->AddActor( actor ); vtkSmartPointer< vtkRenderWindow > window = vtkSmartPointer< vtkRenderWindow >::New( ); window->SetSize( 800, 800 ); window->AddRenderer( renderer ); // VTK interaction vtkSmartPointer< vtkInteractorStyleImage > imageStyle = vtkSmartPointer< vtkInteractorStyleImage >::New( ); vtkSmartPointer< vtkRenderWindowInteractor > interactor = vtkSmartPointer< vtkRenderWindowInteractor >::New( ); interactor->SetInteractorStyle( imageStyle ); window->SetInteractor( interactor ); window->Render( ); // Create the widget and its representation vtkSmartPointer< vtkPointHandleRepresentation3D > handle = vtkSmartPointer< vtkPointHandleRepresentation3D >::New( ); handle->GetProperty( )->SetColor( 1, 0, 0 ); vtkSmartPointer< vtkSeedRepresentation > rep = vtkSmartPointer< vtkSeedRepresentation >::New( ); rep->SetHandleRepresentation( handle ); vtkSmartPointer< vtkSeedWidget > widget = vtkSmartPointer< vtkSeedWidget >::New( ); widget->SetInteractor( interactor ); widget->SetRepresentation( rep ); // Let some interaction interactor->Initialize( ); window->Render( ); widget->On( ); interactor->Start( ); // Configure observer TObserver::Pointer obs = TObserver::New( ); obs->SetImage( dist_filter->GetOutput( ), window ); // Configure membership function TScalarFunction::Pointer cost_function = TScalarFunction::New( ); // Configure algorithm TExtractor::Pointer algorithm = TExtractor::New( ); for( unsigned int s = 0; s < rep->GetNumberOfSeeds( ); s++ ) { double pos[ 3 ]; rep->GetSeedWorldPosition( s, pos ); TImage::PointType pnt; pnt[ 0 ] = pos[ 0 ]; pnt[ 1 ] = pos[ 1 ]; TImage::IndexType idx; if( input_image->TransformPhysicalPointToIndex( pnt, idx ) ) { algorithm->AddSeed( idx, 0 ); if( s == 0 ) algorithm->SetRoot( idx ); else algorithm->AddLeaf( idx ); } // fi } // rof algorithm->AddObserver( itk::AnyEvent( ), obs ); algorithm->ThrowEventsOn( ); algorithm->SetInput( dist_filter->GetOutput( ) ); algorithm->SetNeighborhoodOrder( 1 ); algorithm->SetStopAtOneFront( stop_at_one_front ); algorithm->SetCostConversion( cost_function ); algorithm->Update( ); // Create image with tree TPixel transparent_color[] = { 0, 0, 0, 0 }; TPixel solid_color[] = { 255, 255, 0, 255 }; TRGBAImage::Pointer tree_image = TRGBAImage::New( ); tree_image->CopyInformation( input_image ); tree_image->SetRequestedRegionToLargestPossibleRegion( ); tree_image->SetBufferedRegion( tree_image->GetRequestedRegion( ) ); tree_image->Allocate( ); tree_image->FillBuffer( TRGBAPixel( transparent_color ) ); const TExtractor::TTree& tree = algorithm->GetTree( ); TExtractor::TTree::const_iterator tIt = tree.begin( ); for( ; tIt != tree.end( ); ++tIt ) tree_image->SetPixel( tIt->first, TRGBAPixel( solid_color ) ); TVTKRGBAImage::Pointer vtk_tree_image = TVTKRGBAImage::New( ); vtk_tree_image->SetInput( tree_image ); vtk_tree_image->Update( ); vtkSmartPointer< vtkImageActor > tree_actor = vtkSmartPointer< vtkImageActor >::New( ); tree_actor->SetInputData( vtk_tree_image->GetOutput( ) ); renderer->AddActor( tree_actor ); window->Render( ); // One last interaction interactor->Start( ); return( 0 ); } // eof - $RCSfile$