// ========================================================================= // @author Leonardo Florez Valencia // @email florez-l@javeriana.edu.co // ========================================================================= #ifndef __fpa__Image__SkeletonFilter__h__ #define __fpa__Image__SkeletonFilter__h__ #include #include #include #include #include namespace fpa { namespace Image { /** */ template< class _TInputImage, class _TDistanceMap = itk::SignedMaurerDistanceMapImageFilter< _TInputImage, itk::Image< double, _TInputImage::ImageDimension > > > class SkeletonFilter : public itk::ProcessObject { public: typedef SkeletonFilter Self; typedef itk::ProcessObject Superclass; typedef itk::SmartPointer< Self > Pointer; typedef itk::SmartPointer< const Self > ConstPointer; typedef _TInputImage TInputImage; typedef _TDistanceMap TDistanceMap; itkStaticConstMacro( Dimension, unsigned int, TInputImage::ImageDimension ); typedef typename TDistanceMap::OutputImageType TOutputImage; typedef typename TInputImage::IndexType TIndex; typedef typename TOutputImage::PixelType TScalar; typedef fpa::Image::Skeleton< Self::Dimension > TSkeleton; protected: typedef std::multimap< TScalar, TIndex > _TSkeletonQueue; /** */ class _TDijkstra : public fpa::Image::Dijkstra< TOutputImage, TOutputImage > { public: typedef _TDijkstra Self; typedef fpa::Image::Dijkstra< TOutputImage, TOutputImage > Superclass; typedef itk::SmartPointer< Self > Pointer; typedef itk::SmartPointer< const Self > ConstPointer; typedef typename Superclass::TNode TNode; typedef typename Superclass::TMST TMST; public: itkNewMacro( Self ); itkTypeMacro( _TDijkstra, fpa::Image::Dijkstra ); itkGetConstReferenceMacro( SkeletonQueue, _TSkeletonQueue ); protected: _TDijkstra( ); virtual ~_TDijkstra( ); virtual void _BeforeGenerateData( ) override; virtual void _UpdateOutputValue( TNode& n ) override; private: // Purposely not implemented _TDijkstra( const Self& other ); Self& operator=( const Self& other ); protected: _TSkeletonQueue m_SkeletonQueue; }; typedef typename _TDijkstra::TMST _TMST; public: itkNewMacro( Self ); itkTypeMacro( fpa::Image::SkeletonFilter, fpa::Image::Dijkstra ); itkBooleanMacro( SeedFromMaximumDistance ); itkGetConstMacro( SeedFromMaximumDistance, bool ); itkSetMacro( SeedFromMaximumDistance, bool ); itkGetConstObjectMacro( DistanceMap, TDistanceMap ); itkGetObjectMacro( DistanceMap, TDistanceMap ); itkGetConstMacro( Seed, TIndex ); itkSetMacro( Seed, TIndex ); public: virtual itk::ModifiedTimeType GetMTime( ) const override; void SetInput( TInputImage* input ); TInputImage* GetInput( ); const TInputImage* GetInput( ) const; TSkeleton* GetOutput( ); const TSkeleton* GetOutput( ) const; protected: SkeletonFilter( ); virtual ~SkeletonFilter( ); virtual void GenerateData( ) override; template< class _TMarksPointer > void _MarkSphere( _TMarksPointer& marks, const TOutputImage* dmap, const TIndex& center ); void _EndPoints( std::vector< TIndex >& end_points, const TOutputImage* dmap, const _TMST* mst, const _TSkeletonQueue& queue ); private: // Purposely not implemented. SkeletonFilter( const Self& other ); Self& operator=( const Self& other ); protected: typename TDistanceMap::Pointer m_DistanceMap; bool m_SeedFromMaximumDistance; TIndex m_Seed; }; } // ecapseman } // ecapseman #ifndef ITK_MANUAL_INSTANTIATION # include #endif // ITK_MANUAL_INSTANTIATION #endif // __fpa__Image__SkeletonFilter__h__ // eof - $RCSfile$