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 <ivq/ITK/ImageSkeleton.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 ivq::ITK::ImageSkeleton< 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 );
100 itkGetConstMacro( EndPoints, std::vector< TIndex > );
103 virtual itk::ModifiedTimeType GetMTime( ) const override;
105 void SetInput( TInputImage* input );
106 TInputImage* GetInput( );
107 const TInputImage* GetInput( ) const;
109 TSkeleton* GetOutput( );
110 const TSkeleton* GetOutput( ) const;
114 virtual ~ExtractSkeleton( );
116 virtual void GenerateData( ) override;
118 template< class _TMarksPointer >
120 _TMarksPointer& marks,
121 const TOutputImage* dmap,
126 std::vector< TIndex >& end_points,
127 const TOutputImage* dmap,
129 const _TSkeletonQueue& queue
133 // Purposely not implemented.
134 ExtractSkeleton( const Self& other );
135 Self& operator=( const Self& other );
138 typename TDistanceMap::Pointer m_DistanceMap;
139 bool m_SeedFromMaximumDistance;
141 std::vector< TIndex > m_EndPoints;
150 #ifndef ITK_MANUAL_INSTANTIATION
151 # include <fpa/Filters/Image/ExtractSkeleton.hxx>
152 #endif // ITK_MANUAL_INSTANTIATION
154 #endif // __fpa__Filters__Image__ExtractSkeleton__h__