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__
8 #include <itkImageRegionConstIteratorWithIndex.h>
10 // -------------------------------------------------------------------------
11 template< class _TInputImage, class _TInputLabels, class _TCostsImage, class _TTraits >
13 fpa::Filters::Image::RandomWalker< _TInputImage, _TInputLabels, _TCostsImage, _TTraits >::
15 fpa::Filters::Image::RandomWalker< _TInputImage, _TInputLabels, _TCostsImage, _TTraits >::
18 return( this->GetOutput( ) );
21 // -------------------------------------------------------------------------
22 template< class _TInputImage, class _TInputLabels, class _TCostsImage, class _TTraits >
24 fpa::Filters::Image::RandomWalker< _TInputImage, _TInputLabels, _TCostsImage, _TTraits >::
26 fpa::Filters::Image::RandomWalker< _TInputImage, _TInputLabels, _TCostsImage, _TTraits >::
27 GetOutputCosts( ) const
29 return( this->GetOutput( ) );
32 // -------------------------------------------------------------------------
33 template< class _TInputImage, class _TInputLabels, class _TCostsImage, class _TTraits >
35 fpa::Filters::Image::RandomWalker< _TInputImage, _TInputLabels, _TCostsImage, _TTraits >::
37 fpa::Filters::Image::RandomWalker< _TInputImage, _TInputLabels, _TCostsImage, _TTraits >::
40 return( this->GetMarks( ) );
43 // -------------------------------------------------------------------------
44 template< class _TInputImage, class _TInputLabels, class _TCostsImage, class _TTraits >
46 fpa::Filters::Image::RandomWalker< _TInputImage, _TInputLabels, _TCostsImage, _TTraits >::
48 fpa::Filters::Image::RandomWalker< _TInputImage, _TInputLabels, _TCostsImage, _TTraits >::
49 GetOutputLabels( ) const
51 return( this->GetMarks( ) );
54 // -------------------------------------------------------------------------
55 template< class _TInputImage, class _TInputLabels, class _TCostsImage, class _TTraits >
57 fpa::Filters::Image::RandomWalker< _TInputImage, _TInputLabels, _TCostsImage, _TTraits >::
59 fpa::Filters::Image::RandomWalker< _TInputImage, _TInputLabels, _TCostsImage, _TTraits >::
62 return( this->GetInput( ) );
65 // -------------------------------------------------------------------------
66 template< class _TInputImage, class _TInputLabels, class _TCostsImage, class _TTraits >
68 fpa::Filters::Image::RandomWalker< _TInputImage, _TInputLabels, _TCostsImage, _TTraits >::
70 fpa::Filters::Image::RandomWalker< _TInputImage, _TInputLabels, _TCostsImage, _TTraits >::
71 GetInputImage( ) const
73 return( this->GetInput( ) );
76 // -------------------------------------------------------------------------
77 template< class _TInputImage, class _TInputLabels, class _TCostsImage, class _TTraits >
79 fpa::Filters::Image::RandomWalker< _TInputImage, _TInputLabels, _TCostsImage, _TTraits >::
80 SetInputImage( TInputImage* image )
82 this->SetInput( image );
85 // -------------------------------------------------------------------------
86 template< class _TInputImage, class _TInputLabels, class _TCostsImage, class _TTraits >
87 fpa::Filters::Image::RandomWalker< _TInputImage, _TInputLabels, _TCostsImage, _TTraits >::
91 fpaFilterInputConfigureMacro( InputLabels, TInputLabels );
94 // -------------------------------------------------------------------------
95 template< class _TInputImage, class _TInputLabels, class _TCostsImage, class _TTraits >
96 fpa::Filters::Image::RandomWalker< _TInputImage, _TInputLabels, _TCostsImage, _TTraits >::
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
107 return( this->GetInputLabels( ) );
110 // -------------------------------------------------------------------------
111 template< class _TInputImage, class _TInputLabels, class _TCostsImage, class _TTraits >
113 fpa::Filters::Image::RandomWalker< _TInputImage, _TInputLabels, _TCostsImage, _TTraits >::
114 _PrepareSeeds( const itk::DataObject* input )
116 // Input object is a labelled image?
117 const TInputLabels* labels = dynamic_cast< const TInputLabels* >( input );
120 this->m_UnifiedSeeds.clear( );
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 )
130 bool is_seed = false;
131 for( unsigned int d = 0; d < Self::Dimension; ++d )
133 for( int s = -1; s <= 1; s += 2 )
135 TVertex neigh = lIt.GetIndex( );
137 if( reg.IsInside( neigh ) )
138 is_seed |= ( labels->GetPixel( neigh ) == 0 );
144 // Add pixel as seed or already marked
146 node.Vertex = lIt.GetIndex( );
147 node.Parent = lIt.GetIndex( );
148 node.FrontId = lIt.Get( );
149 node.Value = TOutputValue( 0 );
152 this->_Mark( node.Vertex, node.FrontId );
153 this->_UpdateOutputValue( node );
156 this->m_UnifiedSeeds.insert( node );
165 #endif // __fpa__Filters__Image__RandomWalker__hxx__