X-Git-Url: https://git.creatis.insa-lyon.fr/pubgit/?a=blobdiff_plain;f=lib%2Ffpa%2FImage%2FSkeletonFilter.h;h=9f0542f47336d1b07b28c2cc294fa96057b1bc83;hb=cd6b3f8433deaf2ba7c6bb0ece8e5912c760db17;hp=5a2563444877ccdbf09cddf5aedef50b3a509db2;hpb=7955ba9683b8032e8cd3ca7aa361568fdbb218d2;p=FrontAlgorithms.git diff --git a/lib/fpa/Image/SkeletonFilter.h b/lib/fpa/Image/SkeletonFilter.h index 5a25634..9f0542f 100644 --- a/lib/fpa/Image/SkeletonFilter.h +++ b/lib/fpa/Image/SkeletonFilter.h @@ -1,10 +1,16 @@ +// ========================================================================= +// @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 +#include +#include namespace fpa { @@ -12,35 +18,45 @@ namespace fpa { /** */ - template< class _TImage > + template< class _TImage, class _TScalar = double > class SkeletonFilter - : public Dijkstra< _TImage, _TImage > + : public fpa::Image::Dijkstra< itk::Image< _TScalar, _TImage::ImageDimension >, itk::Image< _TScalar, _TImage::ImageDimension > > { public: - typedef SkeletonFilter Self; - typedef Dijkstra< _TImage, _TImage > Superclass; - typedef itk::SmartPointer< Self > Pointer; + // 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 _TImage TImage; - itkStaticConstMacro( - Dimension, unsigned int, TImage::ImageDimension - ); + typedef typename Superclass::TVertex TVertex; + typedef typename Superclass::TOutputValue TOutputValue; - 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; + typedef itk::SignedMaurerDistanceMapImageFilter< TImage, TScalarImage > TDistanceMap; + typedef itk::Image< unsigned char, TImage::ImageDimension > TMarks; + typedef fpa::Base::Skeleton< TImage::ImageDimension > TSkeleton; protected: - typedef typename Superclass::_TQueueNode _TQueueNode; - typedef std::multimap< double, TIndex, std::greater< double > > _TSkeletonQueue; - + 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, itk::Object ); + 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( ); @@ -48,21 +64,21 @@ namespace fpa SkeletonFilter( ); virtual ~SkeletonFilter( ); - virtual void _BeforeGenerateData( ) fpa_OVERRIDE; - virtual void _UpdateResult( const _TQueueNode& n ) fpa_OVERRIDE; - virtual void _AfterGenerateData( ) fpa_OVERRIDE; + virtual void GenerateData( ) override; + virtual void _SetOutputValue( const TVertex& vertex, const TOutputValue& value ) override; - void _EndPoints( std::vector< TIndex >& end_points ); - void _Skeleton( const std::vector< TIndex >& end_points ); + 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: - // Purposely not defined 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; };