// ========================================================================= // @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$