]> Creatis software - FrontAlgorithms.git/blob - lib/fpa/Image/SkeletonFilter.h
9f0542f47336d1b07b28c2cc294fa96057b1bc83
[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 <fpa/Image/Dijkstra.h>
10
11 #include <map>
12 #include <itkSignedMaurerDistanceMapImageFilter.h>
13 #include <fpa/Base/Skeleton.h>
14
15 namespace fpa
16 {
17   namespace Image
18   {
19     /**
20      */
21     template< class _TImage, class _TScalar = double >
22     class SkeletonFilter
23       : public fpa::Image::Dijkstra< itk::Image< _TScalar, _TImage::ImageDimension >, itk::Image< _TScalar, _TImage::ImageDimension > >
24     {
25     public:
26       // Smart pointers
27       typedef _TImage  TImage;
28       typedef _TScalar TScalar;
29       typedef itk::Image< TScalar, TImage::ImageDimension > TScalarImage;
30       typedef SkeletonFilter Self;
31       typedef fpa::Image::Dijkstra< TScalarImage, TScalarImage > Superclass;
32       typedef itk::SmartPointer< Self > Pointer;
33       typedef itk::SmartPointer< const Self > ConstPointer;
34
35       typedef typename Superclass::TVertex TVertex;
36       typedef typename Superclass::TOutputValue TOutputValue;
37
38       typedef itk::SignedMaurerDistanceMapImageFilter< TImage, TScalarImage > TDistanceMap;
39       typedef itk::Image< unsigned char, TImage::ImageDimension > TMarks;
40       typedef fpa::Base::Skeleton< TImage::ImageDimension > TSkeleton;
41
42     protected:
43       typedef std::multimap< TScalar, TVertex, std::greater< TScalar > > _TSkeletonQueue;
44       typedef std::map< TVertex, TVertex, typename TVertex::LexicographicCompare > _TAdjacencies;
45       
46     public:
47       itkNewMacro( Self );
48       itkTypeMacro( fpa::Image::SkeletonFilter, fpa::Image::Dijkstra );
49
50       itkBooleanMacro( SeedFromMaximumDistance );
51       itkGetConstMacro( SeedFromMaximumDistance, bool );
52       itkSetMacro( SeedFromMaximumDistance, bool );
53
54     public:
55       virtual void SetInput( const TScalarImage* image ) override;
56       void SetInput( const TImage* image );
57       TImage* GetInput( );
58       const TImage* GetInput( ) const;
59
60       TSkeleton* GetSkeleton( );
61       TMarks* GetMarks( );
62
63     protected:
64       SkeletonFilter( );
65       virtual ~SkeletonFilter( );
66
67       virtual void GenerateData( ) override;
68       virtual void _SetOutputValue( const TVertex& vertex, const TOutputValue& value ) override;
69
70       void _EndPoints( std::vector< TVertex >& end_points, _TAdjacencies& A );
71       void _Skeleton( const std::vector< TVertex >& end_points, _TAdjacencies& A );
72       void _MarkSphere( const TVertex& idx );
73
74     private:
75       SkeletonFilter( const Self& other );
76       Self& operator=( const Self& other );
77
78     protected:
79       bool m_SeedFromMaximumDistance;
80       typename TDistanceMap::Pointer m_DistanceMap;
81       _TSkeletonQueue m_SkeletonQueue;
82       unsigned long m_SkeletonIdx;
83       unsigned long m_MarksIdx;
84     };
85
86   } // ecapseman
87
88 } // ecapseman
89
90 #ifndef ITK_MANUAL_INSTANTIATION
91 #  include <fpa/Image/SkeletonFilter.hxx>
92 #endif // ITK_MANUAL_INSTANTIATION
93
94 #endif // __fpa__Image__SkeletonFilter__h__
95
96 // eof - $RCSfile$