#include #include #include #include #include #include // ------------------------------------------------------------------------- fpaPluginsImageAlgorithms::SkeletonFilter:: SkeletonFilter( ) : Superclass( ) { typedef cpInstances::DataObjects::Image _TImage; typedef cpInstances::DataObjects::Skeleton _TSkeleton; typedef cpPlugins::Pipeline::DataObject _TData; this->_ConfigureInput< _TImage >( "Input", true, false ); this->_ConfigureInput< _TData >( "Seeds", true, false ); this->_ConfigureOutput< _TSkeleton >( "Skeleton" ); this->_ConfigureOutput< _TImage >( "Marks" ); } // ------------------------------------------------------------------------- fpaPluginsImageAlgorithms::SkeletonFilter:: ~SkeletonFilter( ) { } // ------------------------------------------------------------------------- void fpaPluginsImageAlgorithms::SkeletonFilter:: _GenerateData( ) { auto o = this->GetInputData( "Input" ); cpPlugins_Demangle_Image_RealPixels_AllDims_1( o, _GD0 ) this->_Error( "Invalid input image." ); } // ------------------------------------------------------------------------- template< class _TImage > void fpaPluginsImageAlgorithms::SkeletonFilter:: _GD0( _TImage* image ) { typedef fpa::Image::SkeletonFilter< _TImage > _TFilter; auto filter = this->_CreateITK< _TFilter >( ); filter->SetInput( image ); auto seeds = this->GetInputData< vtkPolyData >( "Seeds" ); if( seeds != NULL ) { typename _TImage::PointType pnt; typename _TImage::IndexType idx; unsigned int dim = ( _TImage::ImageDimension < 3 )? _TImage::ImageDimension: 3; for( int i = 0; i < seeds->GetNumberOfPoints( ); ++i ) { double buf[ 3 ]; seeds->GetPoint( i, buf ); pnt.Fill( 0 ); for( unsigned int d = 0; d < dim; ++d ) pnt[ d ] = buf[ d ]; if( image->TransformPhysicalPointToIndex( pnt, idx ) ) filter->AddSeed( idx, 0 ); } // rof } // fi filter->Update( ); this->GetOutput( "Skeleton" )->SetITK( filter->GetSkeleton( ) ); this->GetOutput( "Marks" )->SetITK( filter->GetMarks( ) ); } // eof - $RCSfile$