X-Git-Url: https://git.creatis.insa-lyon.fr/pubgit/?a=blobdiff_plain;f=lib%2Ffpa%2FImage%2FSkeletonFilter.h;h=11c2a74294abbb27ea7a3f58969ff09902669888;hb=ed2108383e59a45c6fa2e9259a27256a93d8aa6a;hp=6ed2b3289daa20469ea8fb63994ae2e4fa3f231b;hpb=e8548d1529b25ab74bca646333612fbe3e16e73f;p=FrontAlgorithms.git diff --git a/lib/fpa/Image/SkeletonFilter.h b/lib/fpa/Image/SkeletonFilter.h index 6ed2b32..11c2a74 100644 --- a/lib/fpa/Image/SkeletonFilter.h +++ b/lib/fpa/Image/SkeletonFilter.h @@ -6,11 +6,13 @@ #ifndef __fpa__Image__SkeletonFilter__h__ #define __fpa__Image__SkeletonFilter__h__ -#include - #include + +#include #include -#include + +#include +#include namespace fpa { @@ -18,32 +20,70 @@ namespace fpa { /** */ - template< class _TImage, class _TScalar = double > + template< class _TInputImage, class _TDistanceMap = itk::SignedMaurerDistanceMapImageFilter< _TInputImage, itk::Image< double, _TInputImage::ImageDimension > > > class SkeletonFilter - : public fpa::Image::Dijkstra< itk::Image< _TScalar, _TImage::ImageDimension >, itk::Image< _TScalar, _TImage::ImageDimension > > + : public itk::ProcessObject { 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 SkeletonFilter Self; + typedef itk::ProcessObject 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 _TInputImage TInputImage; + typedef _TDistanceMap TDistanceMap; + itkStaticConstMacro( + Dimension, + unsigned int, + TInputImage::ImageDimension + ); - typedef itk::SignedMaurerDistanceMapImageFilter< TImage, TScalarImage > TDistanceMap; - typedef itk::Image< unsigned char, TImage::ImageDimension > TMarks; - typedef fpa::Base::Skeleton< TImage::ImageDimension > TSkeleton; + 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, TVertex, std::greater< TScalar > > _TSkeletonQueue; - typedef std::map< TVertex, TVertex, typename TVertex::LexicographicCompare > _TAdjacencies; - + 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( const 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 ); @@ -52,36 +92,51 @@ namespace fpa itkGetConstMacro( SeedFromMaximumDistance, bool ); itkSetMacro( SeedFromMaximumDistance, bool ); + itkGetConstObjectMacro( DistanceMap, TDistanceMap ); + itkGetObjectMacro( DistanceMap, TDistanceMap ); + + itkGetConstMacro( Seed, TIndex ); + itkSetMacro( Seed, TIndex ); + public: - virtual void SetInput( const TScalarImage* image ) override; - void SetInput( const TImage* image ); - TImage* GetInput( ); - const TImage* GetInput( ) const; + virtual itk::ModifiedTimeType GetMTime( ) const override; - TSkeleton* GetSkeleton( ); - TMarks* GetMarks( ); + void SetInput( TInputImage* input ); + TInputImage* GetInput( ); + const TInputImage* GetInput( ) const; + + TSkeleton* GetOutput( ); + const TSkeleton* GetOutput( ) const; 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 ); + 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: - bool m_SeedFromMaximumDistance; typename TDistanceMap::Pointer m_DistanceMap; - _TSkeletonQueue m_SkeletonQueue; - unsigned long m_SkeletonIdx; - unsigned long m_MarksIdx; + bool m_SeedFromMaximumDistance; + TIndex m_Seed; }; } // ecapseman