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