]> Creatis software - FrontAlgorithms.git/blobdiff - lib/fpa/Filters/Image/ExtractSkeleton.h
...
[FrontAlgorithms.git] / lib / fpa / Filters / Image / ExtractSkeleton.h
diff --git a/lib/fpa/Filters/Image/ExtractSkeleton.h b/lib/fpa/Filters/Image/ExtractSkeleton.h
new file mode 100644 (file)
index 0000000..5f4e9b8
--- /dev/null
@@ -0,0 +1,153 @@
+// =========================================================================
+// @author Leonardo Florez Valencia
+// @email florez-l@javeriana.edu.co
+// =========================================================================
+#ifndef __fpa__Filters__Image__ExtractSkeleton__h__
+#define __fpa__Filters__Image__ExtractSkeleton__h__
+
+#include <map>
+#include <itkProcessObject.h>
+#include <itkSignedMaurerDistanceMapImageFilter.h>
+#include <fpa/Filters/Image/Dijkstra.h>
+#include <fpa/DataStructures/Image/Skeleton.h>
+
+namespace fpa
+{
+  namespace Filters
+  {
+    namespace Image
+    {
+      /**
+       */
+      template< class _TInputImage, class _TDistanceMap = itk::SignedMaurerDistanceMapImageFilter< _TInputImage, itk::Image< double, _TInputImage::ImageDimension > > >
+      class ExtractSkeleton
+        : public itk::ProcessObject
+      {
+      public:
+        typedef ExtractSkeleton                 Self;
+        typedef itk::ProcessObject              Superclass;
+        typedef itk::SmartPointer< Self >       Pointer;
+        typedef itk::SmartPointer< const Self > ConstPointer;
+
+        typedef _TInputImage  TInputImage;
+        typedef _TDistanceMap TDistanceMap;
+        itkStaticConstMacro(
+          Dimension,
+          unsigned int,
+          TInputImage::ImageDimension
+          );
+
+        typedef typename TDistanceMap::OutputImageType TOutputImage;
+        typedef typename TInputImage::IndexType        TIndex;
+        typedef typename TOutputImage::PixelType       TScalar;
+
+        typedef fpa::DataStructures::Image::Skeleton< Self::Dimension > TSkeleton;
+
+      protected:
+        typedef std::multimap< TScalar, TIndex > _TSkeletonQueue;
+
+        /**
+         */
+        class _TDijkstra
+          : public fpa::Filters::Image::Dijkstra< TOutputImage, TOutputImage >
+        {
+        public:
+          typedef fpa::Filters::Image::Dijkstra< TOutputImage, TOutputImage > Superclass;
+          typedef _TDijkstra                      Self;
+          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 _PostComputeOutputValue( 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::ExtractSkeleton, fpa::Image::Dijkstra );
+
+        itkBooleanMacro( SeedFromMaximumDistance );
+        itkGetConstMacro( SeedFromMaximumDistance, bool );
+        itkSetMacro( SeedFromMaximumDistance, bool );
+
+        itkGetConstObjectMacro( DistanceMap, TDistanceMap );
+        itkGetObjectMacro( DistanceMap, TDistanceMap );
+
+        itkGetConstMacro( Seed, TIndex );
+        itkSetMacro( Seed, TIndex );
+
+      public:
+        virtual itk::ModifiedTimeType GetMTime( ) const override;
+
+        void SetInput( TInputImage* input );
+        TInputImage* GetInput( );
+        const TInputImage* GetInput( ) const;
+
+        TSkeleton* GetOutput( );
+        const TSkeleton* GetOutput( ) const;
+
+      protected:
+        ExtractSkeleton( );
+        virtual ~ExtractSkeleton( );
+
+        virtual void GenerateData( ) override;
+
+        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.
+        ExtractSkeleton( const Self& other );
+        Self& operator=( const Self& other );
+
+      protected:
+        typename TDistanceMap::Pointer m_DistanceMap;
+        bool   m_SeedFromMaximumDistance;
+        TIndex m_Seed;
+      };
+
+    } // ecapseman
+
+  } // ecapseman
+
+} // ecapseman
+
+#ifndef ITK_MANUAL_INSTANTIATION
+#  include <fpa/Filters/Image/ExtractSkeleton.hxx>
+#endif // ITK_MANUAL_INSTANTIATION
+
+#endif // __fpa__Filters__Image__ExtractSkeleton__h__
+
+// eof - $RCSfile$