// ========================================================================= // @author Leonardo Florez Valencia // @email florez-l@javeriana.edu.co // ========================================================================= #ifndef __fpa__Image__SkeletonFilter__h__ #define __fpa__Image__SkeletonFilter__h__ #include #include #include #include namespace fpa { namespace Image { /** */ template< class _TImage, class _TScalar = double > class SkeletonFilter : public fpa::Image::Dijkstra< itk::Image< _TScalar, _TImage::ImageDimension >, itk::Image< _TScalar, _TImage::ImageDimension > > { public: // Smart pointers typedef _TImage TImage; typedef _TScalar TScalar; typedef itk::Image< TScalar, TImage::ImageDimension > TScalarImage; typedef SkeletonFilter Self; typedef fpa::Image::Dijkstra< TScalarImage, TScalarImage > Superclass; typedef itk::SmartPointer< Self > Pointer; typedef itk::SmartPointer< const Self > ConstPointer; typedef typename Superclass::TMST TMST; typedef typename Superclass::TVertex TVertex; typedef typename Superclass::TOutputValue TOutputValue; typedef itk::SignedMaurerDistanceMapImageFilter< TImage, TScalarImage > TDistanceMap; typedef itk::Image< unsigned char, TImage::ImageDimension > TMarks; typedef fpa::Base::Skeleton< TImage::ImageDimension > TSkeleton; protected: typedef std::multimap< TScalar, TVertex, std::greater< TScalar > > _TSkeletonQueue; typedef std::map< TVertex, TVertex, typename TVertex::LexicographicCompare > _TAdjacencies; public: itkNewMacro( Self ); itkTypeMacro( fpa::Image::SkeletonFilter, fpa::Image::Dijkstra ); itkBooleanMacro( SeedFromMaximumDistance ); itkGetConstMacro( SeedFromMaximumDistance, bool ); itkSetMacro( SeedFromMaximumDistance, bool ); public: virtual void SetInput( const TScalarImage* image ) override; void SetInput( const TImage* image ); TImage* GetInput( ); const TImage* GetInput( ) const; TSkeleton* GetSkeleton( ); TMarks* GetMarks( ); protected: SkeletonFilter( ); virtual ~SkeletonFilter( ); virtual void GenerateData( ) override; virtual void _SetOutputValue( const TVertex& vertex, const TOutputValue& value ) override; void _EndPoints( std::vector< TVertex >& end_points, _TAdjacencies& A ); void _Skeleton( const std::vector< TVertex >& end_points, _TAdjacencies& A ); void _MarkSphere( const TVertex& idx ); private: SkeletonFilter( const Self& other ); Self& operator=( const Self& other ); protected: bool m_SeedFromMaximumDistance; typename TDistanceMap::Pointer m_DistanceMap; _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$