]> Creatis software - FrontAlgorithms.git/blob - lib/fpa/Filters/Image/RandomWalker.hxx
ef858b597acf65d177a826b7b1a678dd9d9b9d12
[FrontAlgorithms.git] / lib / fpa / Filters / Image / RandomWalker.hxx
1 // =========================================================================
2 // @author Leonardo Florez Valencia
3 // @email florez-l@javeriana.edu.co
4 // =========================================================================
5 #ifndef __fpa__Filters__Image__RandomWalker__hxx__
6 #define __fpa__Filters__Image__RandomWalker__hxx__
7
8 #include <itkImageRegionConstIteratorWithIndex.h>
9
10 // -------------------------------------------------------------------------
11 template< class _TInputImage, class _TInputLabels, class _TCostsImage, class _TTraits >
12 typename
13 fpa::Filters::Image::RandomWalker< _TInputImage, _TInputLabels, _TCostsImage, _TTraits >::
14 TCostsImage*
15 fpa::Filters::Image::RandomWalker< _TInputImage, _TInputLabels, _TCostsImage, _TTraits >::
16 GetOutputCosts( )
17 {
18   return( this->GetOutput( ) );
19 }
20
21 // -------------------------------------------------------------------------
22 template< class _TInputImage, class _TInputLabels, class _TCostsImage, class _TTraits >
23 const typename
24 fpa::Filters::Image::RandomWalker< _TInputImage, _TInputLabels, _TCostsImage, _TTraits >::
25 TCostsImage*
26 fpa::Filters::Image::RandomWalker< _TInputImage, _TInputLabels, _TCostsImage, _TTraits >::
27 GetOutputCosts( ) const
28 {
29   return( this->GetOutput( ) );
30 }
31
32 // -------------------------------------------------------------------------
33 template< class _TInputImage, class _TInputLabels, class _TCostsImage, class _TTraits >
34 typename
35 fpa::Filters::Image::RandomWalker< _TInputImage, _TInputLabels, _TCostsImage, _TTraits >::
36 TOutputLabels*
37 fpa::Filters::Image::RandomWalker< _TInputImage, _TInputLabels, _TCostsImage, _TTraits >::
38 GetOutputLabels( )
39 {
40   return( this->GetMarks( ) );
41 }
42
43 // -------------------------------------------------------------------------
44 template< class _TInputImage, class _TInputLabels, class _TCostsImage, class _TTraits >
45 const typename
46 fpa::Filters::Image::RandomWalker< _TInputImage, _TInputLabels, _TCostsImage, _TTraits >::
47 TOutputLabels*
48 fpa::Filters::Image::RandomWalker< _TInputImage, _TInputLabels, _TCostsImage, _TTraits >::
49 GetOutputLabels( ) const
50 {
51   return( this->GetMarks( ) );
52 }
53
54 // -------------------------------------------------------------------------
55 template< class _TInputImage, class _TInputLabels, class _TCostsImage, class _TTraits >
56 typename
57 fpa::Filters::Image::RandomWalker< _TInputImage, _TInputLabels, _TCostsImage, _TTraits >::
58 TInputImage*
59 fpa::Filters::Image::RandomWalker< _TInputImage, _TInputLabels, _TCostsImage, _TTraits >::
60 GetInputImage( )
61 {
62   return( this->GetInput( ) );
63 }
64
65 // -------------------------------------------------------------------------
66 template< class _TInputImage, class _TInputLabels, class _TCostsImage, class _TTraits >
67 const typename
68 fpa::Filters::Image::RandomWalker< _TInputImage, _TInputLabels, _TCostsImage, _TTraits >::
69 TInputImage*
70 fpa::Filters::Image::RandomWalker< _TInputImage, _TInputLabels, _TCostsImage, _TTraits >::
71 GetInputImage( ) const
72 {
73   return( this->GetInput( ) );
74 }
75
76 // -------------------------------------------------------------------------
77 template< class _TInputImage, class _TInputLabels, class _TCostsImage, class _TTraits >
78 void
79 fpa::Filters::Image::RandomWalker< _TInputImage, _TInputLabels, _TCostsImage, _TTraits >::
80 SetInputImage( TInputImage* image )
81 {
82   this->SetInput( image );
83 }
84
85 // -------------------------------------------------------------------------
86 template< class _TInputImage, class _TInputLabels, class _TCostsImage, class _TTraits >
87 fpa::Filters::Image::RandomWalker< _TInputImage, _TInputLabels, _TCostsImage, _TTraits >::
88 RandomWalker( )
89   : Superclass( )
90 {
91   fpaFilterInputConfigureMacro( InputLabels, TInputLabels );
92 }
93
94 // -------------------------------------------------------------------------
95 template< class _TInputImage, class _TInputLabels, class _TCostsImage, class _TTraits >
96 fpa::Filters::Image::RandomWalker< _TInputImage, _TInputLabels, _TCostsImage, _TTraits >::
97 ~RandomWalker( )
98 {
99 }
100
101 // -------------------------------------------------------------------------
102 template< class _TInputImage, class _TInputLabels, class _TCostsImage, class _TTraits >
103 const itk::DataObject*
104 fpa::Filters::Image::RandomWalker< _TInputImage, _TInputLabels, _TCostsImage, _TTraits >::
105 _GetReferenceInput( ) const
106 {
107   return( this->GetInputLabels( ) );
108 }
109
110 // -------------------------------------------------------------------------
111 template< class _TInputImage, class _TInputLabels, class _TCostsImage, class _TTraits >
112 void
113 fpa::Filters::Image::RandomWalker< _TInputImage, _TInputLabels, _TCostsImage, _TTraits >::
114 _PrepareSeeds( const itk::DataObject* input )
115 {
116   // Input object is a labelled image?
117   const TInputLabels* labels = dynamic_cast< const TInputLabels* >( input );
118   if( labels != NULL )
119   {
120     this->m_UnifiedSeeds.clear( );
121
122     // Iterate over labels
123     typedef itk::ImageRegionConstIteratorWithIndex< TInputLabels > _TIt;
124     typename TInputLabels::RegionType reg = labels->GetRequestedRegion( );
125     _TIt lIt( labels, reg );
126     for( lIt.GoToBegin( ); !lIt.IsAtEnd( ); ++lIt )
127     {
128       if( lIt.Get( ) > 0 )
129       {
130         bool is_seed = false;
131         for( unsigned int d = 0; d < Self::Dimension; ++d )
132         {
133           for( int s = -1; s <= 1; s += 2 )
134           {
135             TVertex neigh = lIt.GetIndex( );
136             neigh[ d ] += s;
137             if( reg.IsInside( neigh ) )
138               is_seed |= ( labels->GetPixel( neigh ) == 0 );
139
140           } // rof
141
142         } // rof
143
144         // Add pixel as seed or already marked
145         TNode node;
146         node.Vertex = lIt.GetIndex( );
147         node.Parent = lIt.GetIndex( );
148         node.FrontId = lIt.Get( );
149         node.Value = TOutputValue( 0 );
150         if( !is_seed )
151         {
152           this->_Mark( node.Vertex, node.FrontId );
153           this->_UpdateOutputValue( node );
154         }
155         else
156           this->m_UnifiedSeeds.insert( node );
157
158       } // fi
159
160     } // rof
161
162   } // fi
163 }
164
165 #endif // __fpa__Filters__Image__RandomWalker__hxx__
166 // eof - $RCSfile$