]> Creatis software - FrontAlgorithms.git/blobdiff - lib/fpa/Image/SkeletonFilter.h
Skeletonization improved.
[FrontAlgorithms.git] / lib / fpa / Image / SkeletonFilter.h
index 85618d79ef723af41774d6af8ed3d45b76e924b5..0ed3789ae0233df298ac811a10f337680d73bbff 100644 (file)
 #ifndef __fpa__Image__SkeletonFilter__h__
 #define __fpa__Image__SkeletonFilter__h__
 
-#include <itkProcessObject.h>
-#include <itkSimpleDataObjectDecorator.h>
-#include <fpa/Image/MinimumSpanningTree.h>
+#include <fpa/Image/Dijkstra.h>
 #include <cpExtensions/DataStructures/Skeleton.h>
+#include <itkSimpleDataObjectDecorator.h>
+#include <functional>
+#include <map>
 #include <set>
 
+/* TODO
+   #include <itkProcessObject.h>
+   #include <fpa/Image/MinimumSpanningTree.h>
+*/
+
 namespace fpa
 {
   namespace Image
   {
     /**
      */
-    template< class _TDistanceMap, class _TCostMap >
+    template< class _TImage >
     class SkeletonFilter
-      : public itk::ProcessObject
+      : public Dijkstra< _TImage, _TImage >
     {
     public:
       typedef SkeletonFilter                  Self;
-      typedef itk::ProcessObject              Superclass;
+      typedef Dijkstra< _TImage, _TImage >    Superclass;
       typedef itk::SmartPointer< Self >       Pointer;
       typedef itk::SmartPointer< const Self > ConstPointer;
 
-#ifdef ITK_USE_CONCEPT_CHECKING
-      itkConceptMacro(
-        SameDimension,
-        ( itk::Concept::SameDimension< _TDistanceMap::ImageDimension, _TCostMap::ImageDimension > )
+      typedef _TImage TImage;
+      itkStaticConstMacro(
+        Dimension, unsigned int, TImage::ImageDimension
         );
-#endif
-      typedef _TDistanceMap TDistanceMap;
-      typedef _TCostMap     TCostMap;
-      typedef typename TCostMap::IndexType TIndex;
-      typedef MinimumSpanningTree< TCostMap::ImageDimension > TMST;
+
+      typedef typename Superclass::TMST  TMST;
+      typedef typename TImage::IndexType TIndex;
+
       typedef
-      cpExtensions::DataStructures::Skeleton< TCostMap::ImageDimension >
-      TSkeleton;
-      typedef itk::Image< unsigned char, _TCostMap::ImageDimension > TMarks;
+      itk::Functor::IndexLexicographicCompare< Self::Dimension > TIndexCmp;
+      typedef std::set< TIndex, TIndexCmp >                      TIndicesData;
+      typedef itk::SimpleDataObjectDecorator< TIndicesData >     TIndices;
+      typedef itk::Image< unsigned char, Self::Dimension >       TMarks;
+      typedef
+      cpExtensions::DataStructures::Skeleton< Self::Dimension >  TSkeleton;
 
+    protected:
+      typedef typename Superclass::_TQueueNode _TQueueNode;
       typedef
-      itk::Functor::IndexLexicographicCompare< _TCostMap::ImageDimension >
-      TIndexCompare;
-      typedef std::set< TIndex, TIndexCompare > TIndicesData;
-      typedef itk::SimpleDataObjectDecorator< TIndicesData > TIndices;
+      std::multimap< double, TIndex, std::greater< double > >
+      _TSkeletonQueue;
 
     public:
       itkNewMacro( Self );
       itkTypeMacro( fpa::Image::SkeletonFilter, itk::Object );
 
     public:
-      _TDistanceMap* GetDistanceMap( );
-      const _TDistanceMap* GetDistanceMap( ) const;
-      void SetDistanceMap( _TDistanceMap* dmap );
-
-      _TCostMap* GetCostMap( );
-      const _TCostMap* GetCostMap( ) const;
-      void SetCostMap( _TCostMap* cmap );
-
-      TMST* GetMinimumSpanningTree( );
-      const TMST* GetMinimumSpanningTree( ) const;
-      void SetMinimumSpanningTree( TMST* mst );
-
       TIndices* GetEndPoints( );
-      const TIndices* GetEndPoints( ) const;
-
       TIndices* GetBifurcations( );
-      const TIndices* GetBifurcations( ) const;
-
       TSkeleton* GetSkeleton( );
-      const TSkeleton* GetSkeleton( ) const;
-
       TMarks* GetMarks( );
-      const TMarks* GetMarks( ) const;
 
     protected:
       SkeletonFilter( );
       virtual ~SkeletonFilter( );
 
-      virtual void GenerateData( ) fpa_OVERRIDE;
-
-      void _EndPoints(
-        const TDistanceMap* dmap,
-        const TCostMap* cmap,
-        const TMST* mst,
-        TIndicesData& end_points
-        );
-
-      void _Skeleton(
-        const TDistanceMap* dmap,
-        const TCostMap* cmap,
-        const TMST* mst,
-        const TIndicesData& end_points,
-        TIndicesData& bifurcations,
-        TSkeleton* skeleton
-        );
+      virtual void _BeforeGenerateData( ) fpa_OVERRIDE;
+      virtual void _UpdateResult( const _TQueueNode& n ) fpa_OVERRIDE;
+      virtual void _AfterGenerateData( ) fpa_OVERRIDE;
+
+      void _EndPoints( );
+      void _Skeleton( );
+
+      /* TODO
+         virtual void GenerateData( ) fpa_OVERRIDE;
+         const TDistanceMap* dmap,
+         const TCostMap* cmap,
+         const TMST* mst,
+         TIndicesData& end_points
+         );
+         const TDistanceMap* dmap,
+         const TCostMap* cmap,
+         const TMST* mst,
+         const TIndicesData& end_points,
+         TIndicesData& bifurcations,
+         TSkeleton* skeleton
+         );
+      */
 
     private:
       // Purposely not defined
       SkeletonFilter( const Self& other );
       Self& operator=( const Self& other );
+
+    protected:
+      _TSkeletonQueue m_SkeletonQueue;
+
+      unsigned long m_EndPointsIdx;
+      unsigned long m_BifurcationsIdx;
+      unsigned long m_SkeletonIdx;
+      unsigned long m_MarksIdx;
     };
 
   } // ecapseman