// ========================================================================= // @author Leonardo Florez Valencia // @email florez-l@javeriana.edu.co // ========================================================================= #ifndef __fpa__Filters__Image__SeedsFromLabelsInterface__hxx__ #define __fpa__Filters__Image__SeedsFromLabelsInterface__hxx__ #include #include // ------------------------------------------------------------------------- template< class _TTraits > fpa::Filters::Image::SeedsFromLabelsInterface< _TTraits >:: SeedsFromLabelsInterface( itk::ProcessObject* f ) : Superclass( f ) { } // ------------------------------------------------------------------------- template< class _TTraits > fpa::Filters::Image::SeedsFromLabelsInterface< _TTraits >:: ~SeedsFromLabelsInterface( ) { } // ------------------------------------------------------------------------- template< class _TTraits > void fpa::Filters::Image::SeedsFromLabelsInterface< _TTraits >:: _PrepareSeeds( const itk::DataObject* reference ) { // Input object is a labelled image? typedef typename _TTraits::TMark _TMark; typedef itk::Image< _TMark, _TTraits::Dimension > _TLabelImage; const _TLabelImage* labels = dynamic_cast< const _TLabelImage* >( reference ); if( labels != NULL ) { this->m_UnifiedSeeds.clear( ); // Iterate over labels typedef itk::ImageRegionConstIteratorWithIndex< _TLabelImage > _TIt; typename _TLabelImage::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 < _TTraits::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 = TMark( lIt.Get( ) ); node.Value = TOutputValue( lIt.Get( ) ); if( !is_seed ) { this->_AssignOutputValue( node ); this->_Mark( node ); } else this->m_UnifiedSeeds.insert( node ); } // fi } // rof } // fi } #endif // __fpa__Filters__Image__SeedsFromLabelsInterface__hxx__ // eof - $RCSfile$