#ifndef __fpa__Image__SkeletonFilter__h__ #define __fpa__Image__SkeletonFilter__h__ #include #include #include #include #include namespace fpa { namespace Image { /** */ template< class _TImage > class SkeletonFilter : public Dijkstra< _TImage, _TImage > { public: typedef SkeletonFilter Self; typedef Dijkstra< _TImage, _TImage > Superclass; typedef itk::SmartPointer< Self > Pointer; typedef itk::SmartPointer< const Self > ConstPointer; typedef _TImage TImage; itkStaticConstMacro( Dimension, unsigned int, TImage::ImageDimension ); typedef typename Superclass::TMST TMST; typedef typename TImage::IndexType TIndex; typedef itk::Image< unsigned char, Self::Dimension > TMarks; typedef cpExtensions::DataStructures::Skeleton< Self::Dimension > TSkeleton; protected: typedef typename Superclass::_TQueueNode _TQueueNode; typedef std::multimap< double, TIndex, std::greater< double > > _TSkeletonQueue; typedef std::map< TIndex, TIndex, typename TIndex::LexicographicCompare > _TAdjacencies; public: itkNewMacro( Self ); itkTypeMacro( fpa::Image::SkeletonFilter, itk::Object ); public: TSkeleton* GetSkeleton( ); TMarks* GetMarks( ); protected: SkeletonFilter( ); virtual ~SkeletonFilter( ); virtual void _BeforeGenerateData( ) override; virtual void _UpdateResult( const _TQueueNode& n ) override; virtual void _AfterGenerateData( ) override; void _EndPoints( std::vector< TIndex >& end_points, _TAdjacencies& A ); void _Skeleton( const std::vector< TIndex >& end_points, _TAdjacencies& A ); void _MarkSphere( const TIndex& idx ); private: // Purposely not defined SkeletonFilter( const Self& other ); Self& operator=( const Self& other ); protected: _TSkeletonQueue m_SkeletonQueue; unsigned long m_SkeletonIdx; unsigned long m_MarksIdx; }; } // ecapseman } // ecapseman #ifndef ITK_MANUAL_INSTANTIATION # include #endif // ITK_MANUAL_INSTANTIATION #endif // __fpa__Image__SkeletonFilter__h__ // eof - $RCSfile$