]> Creatis software - FrontAlgorithms.git/blob - lib/fpa/Image/SkeletonFilter.h
0fbb3d5ade737d233e150e986aa67bc792f16a73
[FrontAlgorithms.git] / lib / fpa / Image / SkeletonFilter.h
1 #ifndef __fpa__Image__SkeletonFilter__h__
2 #define __fpa__Image__SkeletonFilter__h__
3
4 #include <map>
5 #include <vector>
6 #include <fpa/Image/Dijkstra.h>
7 #include <cpExtensions/DataStructures/Skeleton.h>
8 #include <itkSimpleDataObjectDecorator.h>
9
10 namespace fpa
11 {
12   namespace Image
13   {
14     /**
15      */
16     template< class _TImage >
17     class SkeletonFilter
18       : public Dijkstra< _TImage, _TImage >
19     {
20     public:
21       typedef SkeletonFilter                  Self;
22       typedef Dijkstra< _TImage, _TImage >    Superclass;
23       typedef itk::SmartPointer< Self >       Pointer;
24       typedef itk::SmartPointer< const Self > ConstPointer;
25
26       typedef _TImage TImage;
27       itkStaticConstMacro(
28         Dimension, unsigned int, TImage::ImageDimension
29         );
30
31       typedef typename Superclass::TMST  TMST;
32       typedef typename TImage::IndexType TIndex;
33       typedef itk::Image< unsigned char, Self::Dimension > TMarks;
34       typedef cpExtensions::DataStructures::Skeleton< Self::Dimension > TSkeleton;
35
36     protected:
37       typedef typename Superclass::_TQueueNode _TQueueNode;
38       typedef std::multimap< double, TIndex, std::greater< double > > _TSkeletonQueue;
39       typedef std::map< TIndex, TIndex, typename TIndex::LexicographicCompare > _TAdjacencies;
40
41     public:
42       itkNewMacro( Self );
43       itkTypeMacro( fpa::Image::SkeletonFilter, itk::Object );
44
45     public:
46       TSkeleton* GetSkeleton( );
47       TMarks* GetMarks( );
48
49     protected:
50       SkeletonFilter( );
51       virtual ~SkeletonFilter( );
52
53       virtual void _BeforeGenerateData( ) override;
54       virtual void _UpdateResult( const _TQueueNode& n ) override;
55       virtual void _AfterGenerateData( ) override;
56
57       void _EndPoints( std::vector< TIndex >& end_points, _TAdjacencies& A );
58       void _Skeleton( const std::vector< TIndex >& end_points, _TAdjacencies& A );
59       void _MarkSphere( const TIndex& idx );
60
61     private:
62       // Purposely not defined
63       SkeletonFilter( const Self& other );
64       Self& operator=( const Self& other );
65
66     protected:
67       _TSkeletonQueue m_SkeletonQueue;
68
69       unsigned long m_SkeletonIdx;
70       unsigned long m_MarksIdx;
71     };
72
73   } // ecapseman
74
75 } // ecapseman
76
77 #ifndef ITK_MANUAL_INSTANTIATION
78 #  include <fpa/Image/SkeletonFilter.hxx>
79 #endif // ITK_MANUAL_INSTANTIATION
80
81 #endif // __fpa__Image__SkeletonFilter__h__
82
83 // eof - $RCSfile$