]> Creatis software - FrontAlgorithms.git/blobdiff - lib/fpa/Image/SkeletonFilter.h
...
[FrontAlgorithms.git] / lib / fpa / Image / SkeletonFilter.h
index 0ed3789ae0233df298ac811a10f337680d73bbff..6ed2b3289daa20469ea8fb63994ae2e4fa3f231b 100644 (file)
@@ -1,17 +1,16 @@
+// =========================================================================
+// @author Leonardo Florez Valencia
+// @email florez-l@javeriana.edu.co
+// =========================================================================
+
 #ifndef __fpa__Image__SkeletonFilter__h__
 #define __fpa__Image__SkeletonFilter__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>
-*/
+#include <map>
+#include <itkSignedMaurerDistanceMapImageFilter.h>
+#include <fpa/Base/Skeleton.h>
 
 namespace fpa
 {
@@ -19,45 +18,46 @@ 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::TMST         TMST;
+      typedef typename Superclass::TVertex      TVertex;
+      typedef typename Superclass::TOutputValue TOutputValue;
 
-      typedef typename Superclass::TMST  TMST;
-      typedef typename TImage::IndexType TIndex;
-
-      typedef
-      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;
+      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:
-      TIndices* GetEndPoints( );
-      TIndices* GetBifurcations( );
+      virtual void SetInput( const TScalarImage* image ) override;
+      void SetInput( const TImage* image );
+      TImage* GetInput( );
+      const TImage* GetInput( ) const;
+
       TSkeleton* GetSkeleton( );
       TMarks* GetMarks( );
 
@@ -65,39 +65,21 @@ namespace fpa
       SkeletonFilter( );
       virtual ~SkeletonFilter( );
 
-      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
-         );
-      */
+      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 );
 
     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_EndPointsIdx;
-      unsigned long m_BifurcationsIdx;
       unsigned long m_SkeletonIdx;
       unsigned long m_MarksIdx;
     };