]> Creatis software - FrontAlgorithms.git/blob - lib/fpa/Base/RegionGrow.h
Multiple thresholds region grow segmentation almost added.
[FrontAlgorithms.git] / lib / fpa / Base / RegionGrow.h
1 #ifndef __FPA__BASE__REGIONGROW__H__
2 #define __FPA__BASE__REGIONGROW__H__
3
4 #include <queue>
5 #include <vector>
6 #include <fpa/Base/Algorithm.h>
7
8 namespace fpa
9 {
10   namespace Base
11   {
12     /**
13      */
14     template< class V, class R, class VV, class VC >
15     class RegionGrowTraits
16     {
17     public:
18       typedef R  TResult;
19       typedef V  TVertex;
20       typedef VV TVertexValue;
21       typedef VC TVertexCmp;
22
23       typedef bool TCost;
24       typedef long TFrontId;
25
26       class TNode
27       {
28       public:
29         TNode( )
30           { }
31         TNode( const TVertex& v, const TFrontId& f )
32           : Vertex( v ),
33             Parent( v ),
34             FrontId( f )
35           { }
36         TNode( const TVertex& v, const TResult& r, const TFrontId& f )
37           : Vertex( v ),
38             Parent( v ),
39             Result( r ),
40             FrontId( f )
41           { }
42         virtual ~TNode( )
43           { }
44
45         TVertex Vertex;
46         TVertex Parent;
47         TResult Result;
48         TFrontId FrontId;
49       };
50
51       typedef std::vector< TNode > TNodes;
52     };
53
54     /**
55      * Region grow is a front propagation with no costs.
56      */
57     template< class V, class R, class VV, class VC, class B >
58     class RegionGrow
59       : public Algorithm< RegionGrowTraits< V, R, VV, VC >, B >
60     {
61     public:
62       typedef V  TVertex;
63       typedef R  TResult;
64       typedef VV TVertexValue;
65       typedef B  TBaseFilter;
66
67       /// Standard class typdedefs
68       typedef RegionGrowTraits< V, R, VV, VC > TTraits;
69       typedef RegionGrow                       Self;
70       typedef Algorithm< TTraits, B >          Superclass;
71       typedef itk::SmartPointer< Self >        Pointer;
72       typedef itk::SmartPointer< const Self >  ConstPointer;
73
74       typedef typename TTraits::TCost TCost;
75
76     protected:
77       typedef typename TTraits::TFrontId  _TFrontId;
78       typedef typename TTraits::TNode     _TNode;
79       typedef typename TTraits::TNodes    _TNodes;
80       typedef std::queue< _TNode >        _TQueue;
81
82     public:
83       itkTypeMacro( RegionGrow, Algorithm );
84
85     protected:
86       RegionGrow( );
87       virtual ~RegionGrow( );
88
89       virtual   bool _UpdateResult    ( _TNode& n );
90       virtual   void _InitializeQueue ( );
91       virtual   bool _IsQueueEmpty    ( ) const;
92       virtual   void _QueuePush       ( const _TNode& n );
93       virtual _TNode _QueuePop        ( );
94       virtual   void _QueueClear      ( );
95       virtual   bool _UpdateNeigh     ( _TNode& nn, const _TNode& n );
96
97       virtual bool _CheckMembership( const _TNode& n ) const = 0;
98
99     private:
100       RegionGrow( const Self& );     // Not impl.
101       void operator=( const Self& ); // Not impl.
102
103     protected:
104       _TQueue m_Queue;
105     };
106
107   } // ecapseman
108
109 } // ecapseman
110
111 #include <fpa/Base/RegionGrow.hxx>
112
113 #endif // __FPA__BASE__REGIONGROW__H__
114
115 // eof - $RCSfile$