1 // =========================================================================
2 // @author Leonardo Florez Valencia
3 // @email florez-l@javeriana.edu.co
4 // =========================================================================
6 #ifndef __fpa__Image__RandomWalker__hxx__
7 #define __fpa__Image__RandomWalker__hxx__
11 #include <itkImageRegionConstIteratorWithIndex.h>
12 #include <itkExceptionObject.h>
14 #include <fpa/Image/Functors/Dijkstra/Gaussian.h>
16 // -------------------------------------------------------------------------
17 template< class _TInputImage, class _TLabelImage, class _TScalar >
19 fpa::Image::RandomWalker< _TInputImage, _TLabelImage, _TScalar >::
22 const TLabelImage* labels = this->GetLabels( );
23 itk::ModifiedTimeType t = this->Superclass::GetMTime( );
26 itk::ModifiedTimeType q = labels->GetMTime( );
33 // -------------------------------------------------------------------------
34 template< class _TInputImage, class _TLabelImage, class _TScalar >
35 fpa::Image::RandomWalker< _TInputImage, _TLabelImage, _TScalar >::
39 typedef fpa::Image::Functors::Dijkstra::Gaussian< TInputImage, TScalar > _TDefaultFunction;
40 this->SetWeightFunction( _TDefaultFunction::New( ) );
43 // -------------------------------------------------------------------------
44 template< class _TInputImage, class _TLabelImage, class _TScalar >
45 fpa::Image::RandomWalker< _TInputImage, _TLabelImage, _TScalar >::
50 // -------------------------------------------------------------------------
51 template< class _TInputImage, class _TLabelImage, class _TScalar >
52 void fpa::Image::RandomWalker< _TInputImage, _TLabelImage, _TScalar >::
53 _BeforeGenerateData( )
55 this->Superclass::_BeforeGenerateData( );
57 dynamic_cast< TWeightFunction* >( this->GetWeightFunction( ) );
59 wf->SetImage( this->GetInput( ) );
62 // -------------------------------------------------------------------------
63 template< class _TInputImage, class _TLabelImage, class _TScalar >
64 void fpa::Image::RandomWalker< _TInputImage, _TLabelImage, _TScalar >::
67 this->m_Seeds.clear( );
68 const TLabelImage* lbl = this->GetLabels( );
71 std::ostringstream msg;
72 msg << "itk::ERROR: fpa::Image::RandomWalker (" << this
73 << "): Labelled image not defined.";
74 ::itk::ExceptionObject e(
75 __FILE__, __LINE__, msg.str( ).c_str( ), ITK_LOCATION
81 // Iterate over labels
82 typename TLabelImage::RegionType reg = lbl->GetRequestedRegion( );
83 itk::ImageRegionConstIteratorWithIndex< TLabelImage > lIt( lbl, reg );
84 for( lIt.GoToBegin( ); !lIt.IsAtEnd( ); ++lIt )
89 for( unsigned int d = 0; d < TLabelImage::ImageDimension; ++d )
91 for( int s = -1; s <= 1; s += 2 )
93 TVertex neigh = lIt.GetIndex( );
95 is_seed |= ( lbl->GetPixel( neigh ) == 0 );
101 typename TSeedsInterface::TNode node;
102 node.Vertex = lIt.GetIndex( );
103 node.Parent = lIt.GetIndex( );
104 node.FrontId = lIt.Get( );
105 node.Value = TScalar( 0 );
108 this->_Mark( lIt.GetIndex( ), lIt.Get( ) );
109 this->_UpdateOutputValue( node );
112 this->m_Seeds.insert( node );
118 // Ok, finish initialization
119 this->Superclass::_QueueInit( );
122 #endif // __fpa__Image__RandomWalker__hxx__