]> Creatis software - FrontAlgorithms.git/blobdiff - lib/fpa/Image/SkeletonFilter.h
...
[FrontAlgorithms.git] / lib / fpa / Image / SkeletonFilter.h
index 9f0542f47336d1b07b28c2cc294fa96057b1bc83..91ba5b8961827a76ac4e362d3c2a87aa7bdfeece 100644 (file)
@@ -6,11 +6,13 @@
 #ifndef __fpa__Image__SkeletonFilter__h__
 #define __fpa__Image__SkeletonFilter__h__
 
-#include <fpa/Image/Dijkstra.h>
-
 #include <map>
+
+#include <itkProcessObject.h>
 #include <itkSignedMaurerDistanceMapImageFilter.h>
-#include <fpa/Base/Skeleton.h>
+
+#include <fpa/Image/Dijkstra.h>
+#include <fpa/Image/Skeleton.h>
 
 namespace fpa
 {
@@ -18,31 +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::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( 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 );
@@ -51,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