1 // =========================================================================
2 // @author Leonardo Florez Valencia
3 // @email florez-l@javeriana.edu.co
4 // =========================================================================
5 #ifndef __fpa__Filters__Image__ExtractSkeleton__h__
6 #define __fpa__Filters__Image__ExtractSkeleton__h__
9 #include <itkProcessObject.h>
10 #include <itkSignedMaurerDistanceMapImageFilter.h>
11 #include <fpa/Filters/Image/Dijkstra.h>
12 #include <fpa/DataStructures/Image/Skeleton.h>
22 template< class _TInputImage, class _TDistanceMap = itk::SignedMaurerDistanceMapImageFilter< _TInputImage, itk::Image< double, _TInputImage::ImageDimension > > >
24 : public itk::ProcessObject
27 typedef ExtractSkeleton Self;
28 typedef itk::ProcessObject Superclass;
29 typedef itk::SmartPointer< Self > Pointer;
30 typedef itk::SmartPointer< const Self > ConstPointer;
32 typedef _TInputImage TInputImage;
33 typedef _TDistanceMap TDistanceMap;
37 TInputImage::ImageDimension
40 typedef typename TDistanceMap::OutputImageType TOutputImage;
41 typedef typename TInputImage::IndexType TIndex;
42 typedef typename TOutputImage::PixelType TScalar;
44 typedef fpa::DataStructures::Image::Skeleton< Self::Dimension > TSkeleton;
47 typedef std::multimap< TScalar, TIndex > _TSkeletonQueue;
52 : public fpa::Filters::Image::Dijkstra< TOutputImage, TOutputImage >
55 typedef fpa::Filters::Image::Dijkstra< TOutputImage, TOutputImage > Superclass;
56 typedef _TDijkstra Self;
57 typedef itk::SmartPointer< Self > Pointer;
58 typedef itk::SmartPointer< const Self > ConstPointer;
60 typedef typename Superclass::TNode TNode;
61 typedef typename Superclass::TMST TMST;
65 itkTypeMacro( _TDijkstra, fpa::Image::Dijkstra );
67 itkGetConstReferenceMacro( SkeletonQueue, _TSkeletonQueue );
71 virtual ~_TDijkstra( );
73 virtual void _BeforeGenerateData( ) override;
74 virtual void _PostComputeOutputValue( TNode& n ) override;
77 // Purposely not implemented
78 _TDijkstra( const Self& other );
79 Self& operator=( const Self& other );
82 _TSkeletonQueue m_SkeletonQueue;
84 typedef typename _TDijkstra::TMST _TMST;
88 itkTypeMacro( fpa::Image::ExtractSkeleton, fpa::Image::Dijkstra );
90 itkBooleanMacro( SeedFromMaximumDistance );
91 itkGetConstMacro( SeedFromMaximumDistance, bool );
92 itkSetMacro( SeedFromMaximumDistance, bool );
94 itkGetConstObjectMacro( DistanceMap, TDistanceMap );
95 itkGetObjectMacro( DistanceMap, TDistanceMap );
97 itkGetConstMacro( Seed, TIndex );
98 itkSetMacro( Seed, TIndex );
101 virtual itk::ModifiedTimeType GetMTime( ) const override;
103 void SetInput( TInputImage* input );
104 TInputImage* GetInput( );
105 const TInputImage* GetInput( ) const;
107 TSkeleton* GetOutput( );
108 const TSkeleton* GetOutput( ) const;
112 virtual ~ExtractSkeleton( );
114 virtual void GenerateData( ) override;
116 template< class _TMarksPointer >
118 _TMarksPointer& marks,
119 const TOutputImage* dmap,
124 std::vector< TIndex >& end_points,
125 const TOutputImage* dmap,
127 const _TSkeletonQueue& queue
131 // Purposely not implemented.
132 ExtractSkeleton( const Self& other );
133 Self& operator=( const Self& other );
136 typename TDistanceMap::Pointer m_DistanceMap;
137 bool m_SeedFromMaximumDistance;
147 #ifndef ITK_MANUAL_INSTANTIATION
148 # include <fpa/Filters/Image/ExtractSkeleton.hxx>
149 #endif // ITK_MANUAL_INSTANTIATION
151 #endif // __fpa__Filters__Image__ExtractSkeleton__h__