]> Creatis software - FrontAlgorithms.git/blob - lib/fpa/Image/MoriRegionGrow.hxx
c414f25d92d8580d1d0008fb298cacdc4ed242f6
[FrontAlgorithms.git] / lib / fpa / Image / MoriRegionGrow.hxx
1 #ifndef __fpa__Image__MoriRegionGrow__hxx__
2 #define __fpa__Image__MoriRegionGrow__hxx__
3
4 // -------------------------------------------------------------------------
5 template< class _TInputImage, class _TOutputImage >
6 fpa::Image::MoriRegionGrow< _TInputImage, _TOutputImage >::
7 MoriRegionGrow( )
8   : Superclass( ),
9     m_Step( TPixel( 1 ) ),
10     m_Sensitivity( double( 1 ) )
11 {
12   this->m_Upper = std::numeric_limits< TPixel >::max( );
13   if( std::numeric_limits< TPixel >::is_integer )
14     this->m_Lower = std::numeric_limits< TPixel >::min( );
15   else
16     this->m_Lower = -this->m_Upper;
17   typename TBinThresholdFunction::Pointer functor =
18     TBinThresholdFunction::New( );
19   this->SetGrowFunction( functor );
20 }
21
22 // -------------------------------------------------------------------------
23 template< class _TInputImage, class _TOutputImage >
24 fpa::Image::MoriRegionGrow< _TInputImage, _TOutputImage >::
25 ~MoriRegionGrow( )
26 {
27 }
28
29 // -------------------------------------------------------------------------
30 template< class _TInputImage, class _TOutputImage >
31 bool fpa::Image::MoriRegionGrow< _TInputImage, _TOutputImage >::
32 _ContinueGenerateData( )
33 {
34   TBinThresholdFunction* functor =
35     dynamic_cast< TBinThresholdFunction* >( this->GetGrowFunction( ) );
36   TPixel u = functor->GetUpper( );
37
38   // Analyze flooding
39   bool stop = false;
40   if( this->m_N > double( 1 ) )
41   {
42     double Q = double( this->m_PrevCount );
43     Q += ( this->m_STD * this->m_Sensitivity );
44     if( double( this->m_ActualCount ) > Q )
45       stop = true;
46
47   } // fi
48   double v;
49   if( this->m_PrevCount > 0 )
50     v = double( this->m_ActualCount ) - double( this->m_PrevCount );
51   else
52     v = double( 0 );
53   this->m_PrevCount = this->m_ActualCount;
54   this->m_N += double( 1 );
55   this->m_S1 += v;
56   this->m_S2 += v * v;
57   if( this->m_N > double( 1 ) )
58     this->m_STD =
59       ( this->m_S2 - ( ( this->m_S1 * this->m_S1 ) / this->m_N ) ) /
60       ( this->m_N - double( 1 ) );
61   else
62     this->m_STD = double( 0 );
63   this->m_STD = std::sqrt( this->m_STD );
64
65   if( u < this->m_Upper )
66   {
67     u += this->m_Step;
68     if( u > this->m_Upper )
69       u = this->m_Upper;
70     functor->SetUpper( u );
71     this->m_Queue = this->m_NextQueue;
72     while( this->m_NextQueue.size( ) > 0 )
73       this->m_NextQueue.pop( );
74     return( !stop );
75   }
76   else
77     return( false );
78 }
79
80 // -------------------------------------------------------------------------
81 template< class _TInputImage, class _TOutputImage >
82 void fpa::Image::MoriRegionGrow< _TInputImage, _TOutputImage >::
83 _BeforeGenerateData( )
84 {
85   this->Superclass::_BeforeGenerateData( );
86
87   while( this->m_NextQueue.size( ) > 0 )
88     this->m_NextQueue.pop( );
89   this->m_ActualCount = 0;
90   this->m_PrevCount = 0;
91   this->m_N   = double( 0 );
92   this->m_S1  = double( 0 );
93   this->m_S2  = double( 0 );
94   this->m_STD = double( 0 );
95   TBinThresholdFunction* functor =
96     dynamic_cast< TBinThresholdFunction* >( this->GetGrowFunction( ) );
97   functor->SetLower( this->m_Lower );
98   functor->SetUpper( this->m_Lower + this->m_Step );
99 }
100
101 // -------------------------------------------------------------------------
102 template< class _TInputImage, class _TOutputImage >
103 void fpa::Image::MoriRegionGrow< _TInputImage, _TOutputImage >::
104 _AfterGenerateData( )
105 {
106   this->Superclass::_AfterGenerateData( );
107   while( this->m_NextQueue.size( ) > 0 )
108     this->m_NextQueue.pop( );
109 }
110
111 // -------------------------------------------------------------------------
112 template< class _TInputImage, class _TOutputImage >
113 void fpa::Image::MoriRegionGrow< _TInputImage, _TOutputImage >::
114 _BeforeLoop( )
115 {
116   this->Superclass::_BeforeLoop( );
117 }
118
119 // -------------------------------------------------------------------------
120 template< class _TInputImage, class _TOutputImage >
121 void fpa::Image::MoriRegionGrow< _TInputImage, _TOutputImage >::
122 _AfterLoop( )
123 {
124   this->Superclass::_AfterLoop( );
125 }
126
127 // -------------------------------------------------------------------------
128 template< class _TInputImage, class _TOutputImage >
129 bool fpa::Image::MoriRegionGrow< _TInputImage, _TOutputImage >::
130 _UpdateValue( _TQueueNode& v, const _TQueueNode& p )
131 {
132   bool ret = this->Superclass::_UpdateValue( v, p );
133   if( !ret )
134   {
135     v.Result = this->m_InsideValue;
136     this->m_NextQueue.push( v );
137
138   } // fi
139   return( ret );
140 }
141
142 // -------------------------------------------------------------------------
143 template< class _TInputImage, class _TOutputImage >
144 void fpa::Image::MoriRegionGrow< _TInputImage, _TOutputImage >::
145 _UpdateResult( const _TQueueNode& n )
146 {
147   this->Superclass::_UpdateResult( n );
148   this->m_ActualCount += 1;
149 }
150
151 #endif // __fpa__Image__MoriRegionGrow__hxx__
152
153 // eof - $RCSfile$