// ========================================================================= // @author Leonardo Florez Valencia // @email florez-l@javeriana.edu.co // ========================================================================= #ifndef __fpa__Filters__Image__LabelsSeedFilter__hxx__ #define __fpa__Filters__Image__LabelsSeedFilter__hxx__ #include // ------------------------------------------------------------------------- template< class _TFilter, class _TInputLabels > fpa::Filters::Image::LabelsSeedFilter< _TFilter, _TInputLabels >:: LabelsSeedFilter( ) : Superclass( ) { fpaFilterInputConfigureMacro( InputLabels, TInputLabels ); } // ------------------------------------------------------------------------- template< class _TFilter, class _TInputLabels > fpa::Filters::Image::LabelsSeedFilter< _TFilter, _TInputLabels >:: ~LabelsSeedFilter( ) { } // ------------------------------------------------------------------------- template< class _TFilter, class _TInputLabels > const itk::DataObject* fpa::Filters::Image::LabelsSeedFilter< _TFilter, _TInputLabels >:: _GetReferenceInput( ) const { return( this->GetInputLabels( ) ); } // ------------------------------------------------------------------------- template< class _TFilter, class _TInputLabels > void fpa::Filters::Image::LabelsSeedFilter< _TFilter, _TInputLabels >:: _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__LabelsSeedFilter__hxx__ // eof - $RCSfile$