X-Git-Url: https://git.creatis.insa-lyon.fr/pubgit/?a=blobdiff_plain;f=lib%2Ffpa%2FFilters%2FImage%2FExtractSkeleton.h;fp=lib%2Ffpa%2FFilters%2FImage%2FExtractSkeleton.h;h=5f4e9b8af9047ec2d191e0cab9043edf77877b69;hb=bd89a1af0c14ed2ac0afeca923103de54283cbaf;hp=0000000000000000000000000000000000000000;hpb=a8ac405fe1422bc0792a810f7f0693096a22c20e;p=FrontAlgorithms.git diff --git a/lib/fpa/Filters/Image/ExtractSkeleton.h b/lib/fpa/Filters/Image/ExtractSkeleton.h new file mode 100644 index 0000000..5f4e9b8 --- /dev/null +++ b/lib/fpa/Filters/Image/ExtractSkeleton.h @@ -0,0 +1,153 @@ +// ========================================================================= +// @author Leonardo Florez Valencia +// @email florez-l@javeriana.edu.co +// ========================================================================= +#ifndef __fpa__Filters__Image__ExtractSkeleton__h__ +#define __fpa__Filters__Image__ExtractSkeleton__h__ + +#include +#include +#include +#include +#include + +namespace fpa +{ + namespace Filters + { + namespace Image + { + /** + */ + template< class _TInputImage, class _TDistanceMap = itk::SignedMaurerDistanceMapImageFilter< _TInputImage, itk::Image< double, _TInputImage::ImageDimension > > > + class ExtractSkeleton + : public itk::ProcessObject + { + public: + typedef ExtractSkeleton 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::DataStructures::Image::Skeleton< Self::Dimension > TSkeleton; + + protected: + typedef std::multimap< TScalar, TIndex > _TSkeletonQueue; + + /** + */ + class _TDijkstra + : public fpa::Filters::Image::Dijkstra< TOutputImage, TOutputImage > + { + public: + typedef fpa::Filters::Image::Dijkstra< TOutputImage, TOutputImage > Superclass; + typedef _TDijkstra Self; + 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 _PostComputeOutputValue( 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::ExtractSkeleton, 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: + ExtractSkeleton( ); + virtual ~ExtractSkeleton( ); + + 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. + ExtractSkeleton( const Self& other ); + Self& operator=( const Self& other ); + + protected: + typename TDistanceMap::Pointer m_DistanceMap; + bool m_SeedFromMaximumDistance; + TIndex m_Seed; + }; + + } // ecapseman + + } // ecapseman + +} // ecapseman + +#ifndef ITK_MANUAL_INSTANTIATION +# include +#endif // ITK_MANUAL_INSTANTIATION + +#endif // __fpa__Filters__Image__ExtractSkeleton__h__ + +// eof - $RCSfile$