X-Git-Url: https://git.creatis.insa-lyon.fr/pubgit/?a=blobdiff_plain;f=lib%2Ffpa%2FFilters%2FImage%2FRandomWalker.hxx;fp=lib%2Ffpa%2FFilters%2FImage%2FRandomWalker.hxx;h=ef858b597acf65d177a826b7b1a678dd9d9b9d12;hb=2047276c8f1a02432fbcc7014722d460d6c1e60f;hp=0000000000000000000000000000000000000000;hpb=3c639e5da479c7216a0a302ffa156ac6762caeed;p=FrontAlgorithms.git diff --git a/lib/fpa/Filters/Image/RandomWalker.hxx b/lib/fpa/Filters/Image/RandomWalker.hxx new file mode 100644 index 0000000..ef858b5 --- /dev/null +++ b/lib/fpa/Filters/Image/RandomWalker.hxx @@ -0,0 +1,166 @@ +// ========================================================================= +// @author Leonardo Florez Valencia +// @email florez-l@javeriana.edu.co +// ========================================================================= +#ifndef __fpa__Filters__Image__RandomWalker__hxx__ +#define __fpa__Filters__Image__RandomWalker__hxx__ + +#include + +// ------------------------------------------------------------------------- +template< class _TInputImage, class _TInputLabels, class _TCostsImage, class _TTraits > +typename +fpa::Filters::Image::RandomWalker< _TInputImage, _TInputLabels, _TCostsImage, _TTraits >:: +TCostsImage* +fpa::Filters::Image::RandomWalker< _TInputImage, _TInputLabels, _TCostsImage, _TTraits >:: +GetOutputCosts( ) +{ + return( this->GetOutput( ) ); +} + +// ------------------------------------------------------------------------- +template< class _TInputImage, class _TInputLabels, class _TCostsImage, class _TTraits > +const typename +fpa::Filters::Image::RandomWalker< _TInputImage, _TInputLabels, _TCostsImage, _TTraits >:: +TCostsImage* +fpa::Filters::Image::RandomWalker< _TInputImage, _TInputLabels, _TCostsImage, _TTraits >:: +GetOutputCosts( ) const +{ + return( this->GetOutput( ) ); +} + +// ------------------------------------------------------------------------- +template< class _TInputImage, class _TInputLabels, class _TCostsImage, class _TTraits > +typename +fpa::Filters::Image::RandomWalker< _TInputImage, _TInputLabels, _TCostsImage, _TTraits >:: +TOutputLabels* +fpa::Filters::Image::RandomWalker< _TInputImage, _TInputLabels, _TCostsImage, _TTraits >:: +GetOutputLabels( ) +{ + return( this->GetMarks( ) ); +} + +// ------------------------------------------------------------------------- +template< class _TInputImage, class _TInputLabels, class _TCostsImage, class _TTraits > +const typename +fpa::Filters::Image::RandomWalker< _TInputImage, _TInputLabels, _TCostsImage, _TTraits >:: +TOutputLabels* +fpa::Filters::Image::RandomWalker< _TInputImage, _TInputLabels, _TCostsImage, _TTraits >:: +GetOutputLabels( ) const +{ + return( this->GetMarks( ) ); +} + +// ------------------------------------------------------------------------- +template< class _TInputImage, class _TInputLabels, class _TCostsImage, class _TTraits > +typename +fpa::Filters::Image::RandomWalker< _TInputImage, _TInputLabels, _TCostsImage, _TTraits >:: +TInputImage* +fpa::Filters::Image::RandomWalker< _TInputImage, _TInputLabels, _TCostsImage, _TTraits >:: +GetInputImage( ) +{ + return( this->GetInput( ) ); +} + +// ------------------------------------------------------------------------- +template< class _TInputImage, class _TInputLabels, class _TCostsImage, class _TTraits > +const typename +fpa::Filters::Image::RandomWalker< _TInputImage, _TInputLabels, _TCostsImage, _TTraits >:: +TInputImage* +fpa::Filters::Image::RandomWalker< _TInputImage, _TInputLabels, _TCostsImage, _TTraits >:: +GetInputImage( ) const +{ + return( this->GetInput( ) ); +} + +// ------------------------------------------------------------------------- +template< class _TInputImage, class _TInputLabels, class _TCostsImage, class _TTraits > +void +fpa::Filters::Image::RandomWalker< _TInputImage, _TInputLabels, _TCostsImage, _TTraits >:: +SetInputImage( TInputImage* image ) +{ + this->SetInput( image ); +} + +// ------------------------------------------------------------------------- +template< class _TInputImage, class _TInputLabels, class _TCostsImage, class _TTraits > +fpa::Filters::Image::RandomWalker< _TInputImage, _TInputLabels, _TCostsImage, _TTraits >:: +RandomWalker( ) + : Superclass( ) +{ + fpaFilterInputConfigureMacro( InputLabels, TInputLabels ); +} + +// ------------------------------------------------------------------------- +template< class _TInputImage, class _TInputLabels, class _TCostsImage, class _TTraits > +fpa::Filters::Image::RandomWalker< _TInputImage, _TInputLabels, _TCostsImage, _TTraits >:: +~RandomWalker( ) +{ +} + +// ------------------------------------------------------------------------- +template< class _TInputImage, class _TInputLabels, class _TCostsImage, class _TTraits > +const itk::DataObject* +fpa::Filters::Image::RandomWalker< _TInputImage, _TInputLabels, _TCostsImage, _TTraits >:: +_GetReferenceInput( ) const +{ + return( this->GetInputLabels( ) ); +} + +// ------------------------------------------------------------------------- +template< class _TInputImage, class _TInputLabels, class _TCostsImage, class _TTraits > +void +fpa::Filters::Image::RandomWalker< _TInputImage, _TInputLabels, _TCostsImage, _TTraits >:: +_PrepareSeeds( const itk::DataObject* input ) +{ + // Input object is a labelled image? + const TInputLabels* labels = dynamic_cast< const TInputLabels* >( input ); + if( labels != NULL ) + { + this->m_UnifiedSeeds.clear( ); + + // Iterate over labels + typedef itk::ImageRegionConstIteratorWithIndex< TInputLabels > _TIt; + typename TInputLabels::RegionType reg = labels->GetRequestedRegion( ); + _TIt lIt( labels, reg ); + for( lIt.GoToBegin( ); !lIt.IsAtEnd( ); ++lIt ) + { + if( lIt.Get( ) > 0 ) + { + bool is_seed = false; + for( unsigned int d = 0; d < Self::Dimension; ++d ) + { + for( int s = -1; s <= 1; s += 2 ) + { + TVertex neigh = lIt.GetIndex( ); + neigh[ d ] += s; + if( reg.IsInside( neigh ) ) + is_seed |= ( labels->GetPixel( neigh ) == 0 ); + + } // rof + + } // rof + + // Add pixel as seed or already marked + TNode node; + node.Vertex = lIt.GetIndex( ); + node.Parent = lIt.GetIndex( ); + node.FrontId = lIt.Get( ); + node.Value = TOutputValue( 0 ); + if( !is_seed ) + { + this->_Mark( node.Vertex, node.FrontId ); + this->_UpdateOutputValue( node ); + } + else + this->m_UnifiedSeeds.insert( node ); + + } // fi + + } // rof + + } // fi +} + +#endif // __fpa__Filters__Image__RandomWalker__hxx__ +// eof - $RCSfile$