]> Creatis software - FrontAlgorithms.git/blob - lib/fpa/Filters/Image/ExtractSkeleton.h
...
[FrontAlgorithms.git] / lib / fpa / Filters / Image / ExtractSkeleton.h
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__
7
8 #include <map>
9 #include <itkProcessObject.h>
10 #include <itkSignedMaurerDistanceMapImageFilter.h>
11 #include <fpa/Filters/Image/Dijkstra.h>
12 #include <fpa/DataStructures/Image/Skeleton.h>
13
14 namespace fpa
15 {
16   namespace Filters
17   {
18     namespace Image
19     {
20       /**
21        */
22       template< class _TInputImage, class _TDistanceMap = itk::SignedMaurerDistanceMapImageFilter< _TInputImage, itk::Image< double, _TInputImage::ImageDimension > > >
23       class ExtractSkeleton
24         : public itk::ProcessObject
25       {
26       public:
27         typedef ExtractSkeleton                 Self;
28         typedef itk::ProcessObject              Superclass;
29         typedef itk::SmartPointer< Self >       Pointer;
30         typedef itk::SmartPointer< const Self > ConstPointer;
31
32         typedef _TInputImage  TInputImage;
33         typedef _TDistanceMap TDistanceMap;
34         itkStaticConstMacro(
35           Dimension,
36           unsigned int,
37           TInputImage::ImageDimension
38           );
39
40         typedef typename TDistanceMap::OutputImageType TOutputImage;
41         typedef typename TInputImage::IndexType        TIndex;
42         typedef typename TOutputImage::PixelType       TScalar;
43
44         typedef fpa::DataStructures::Image::Skeleton< Self::Dimension > TSkeleton;
45
46       protected:
47         typedef std::multimap< TScalar, TIndex > _TSkeletonQueue;
48
49         /**
50          */
51         class _TDijkstra
52           : public fpa::Filters::Image::Dijkstra< TOutputImage, TOutputImage >
53         {
54         public:
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;
59
60           typedef typename Superclass::TNode TNode;
61           typedef typename Superclass::TMST  TMST;
62
63         public:
64           itkNewMacro( Self );
65           itkTypeMacro( _TDijkstra, fpa::Image::Dijkstra );
66
67           itkGetConstReferenceMacro( SkeletonQueue, _TSkeletonQueue );
68
69         protected:
70           _TDijkstra( );
71           virtual ~_TDijkstra( );
72
73           virtual void _BeforeGenerateData( ) override;
74           virtual void _PostComputeOutputValue( TNode& n ) override;
75
76         private:
77           // Purposely not implemented
78           _TDijkstra( const Self& other );
79           Self& operator=( const Self& other );
80
81         protected:
82           _TSkeletonQueue m_SkeletonQueue;
83         };
84         typedef typename _TDijkstra::TMST _TMST;
85
86       public:
87         itkNewMacro( Self );
88         itkTypeMacro( fpa::Image::ExtractSkeleton, fpa::Image::Dijkstra );
89
90         itkBooleanMacro( SeedFromMaximumDistance );
91         itkGetConstMacro( SeedFromMaximumDistance, bool );
92         itkSetMacro( SeedFromMaximumDistance, bool );
93
94         itkGetConstObjectMacro( DistanceMap, TDistanceMap );
95         itkGetObjectMacro( DistanceMap, TDistanceMap );
96
97         itkGetConstMacro( Seed, TIndex );
98         itkSetMacro( Seed, TIndex );
99
100       public:
101         virtual itk::ModifiedTimeType GetMTime( ) const override;
102
103         void SetInput( TInputImage* input );
104         TInputImage* GetInput( );
105         const TInputImage* GetInput( ) const;
106
107         TSkeleton* GetOutput( );
108         const TSkeleton* GetOutput( ) const;
109
110       protected:
111         ExtractSkeleton( );
112         virtual ~ExtractSkeleton( );
113
114         virtual void GenerateData( ) override;
115
116         template< class _TMarksPointer >
117         void _MarkSphere(
118           _TMarksPointer& marks,
119           const TOutputImage* dmap,
120           const TIndex& center
121           );
122
123         void _EndPoints(
124           std::vector< TIndex >& end_points,
125           const TOutputImage* dmap,
126           const _TMST* mst,
127           const _TSkeletonQueue& queue
128           );
129
130       private:
131         // Purposely not implemented.
132         ExtractSkeleton( const Self& other );
133         Self& operator=( const Self& other );
134
135       protected:
136         typename TDistanceMap::Pointer m_DistanceMap;
137         bool   m_SeedFromMaximumDistance;
138         TIndex m_Seed;
139       };
140
141     } // ecapseman
142
143   } // ecapseman
144
145 } // ecapseman
146
147 #ifndef ITK_MANUAL_INSTANTIATION
148 #  include <fpa/Filters/Image/ExtractSkeleton.hxx>
149 #endif // ITK_MANUAL_INSTANTIATION
150
151 #endif // __fpa__Filters__Image__ExtractSkeleton__h__
152
153 // eof - $RCSfile$