// ========================================================================= // @author Leonardo Florez Valencia // @email florez-l@javeriana.edu.co // ========================================================================= #ifndef __CTBronchi__MoriLabelling__hxx__ #define __CTBronchi__MoriLabelling__hxx__ #include // ------------------------------------------------------------------------- template< class _TInputImage, class _TLabelImage, class _TTraits > const typename CTBronchi::MoriLabelling< _TInputImage, _TLabelImage, _TTraits >:: TLabelImage* CTBronchi::MoriLabelling< _TInputImage, _TLabelImage, _TTraits >:: GetInputLabelImage( ) const { return( this->GetLabels( ) ); } // ------------------------------------------------------------------------- template< class _TInputImage, class _TLabelImage, class _TTraits > void CTBronchi::MoriLabelling< _TInputImage, _TLabelImage, _TTraits >:: SetInputLabelImage( TLabelImage* image ) { this->SetLabels( image ); } // ------------------------------------------------------------------------- template< class _TInputImage, class _TLabelImage, class _TTraits > const typename CTBronchi::MoriLabelling< _TInputImage, _TLabelImage, _TTraits >:: TInputImage* CTBronchi::MoriLabelling< _TInputImage, _TLabelImage, _TTraits >:: GetInputRawImage( ) const { return( this->GetInput( ) ); } // ------------------------------------------------------------------------- template< class _TInputImage, class _TLabelImage, class _TTraits > void CTBronchi::MoriLabelling< _TInputImage, _TLabelImage, _TTraits >:: SetInputRawImage( TInputImage* image ) { this->SetInput( image ); } // ------------------------------------------------------------------------- template< class _TInputImage, class _TLabelImage, class _TTraits > typename CTBronchi::MoriLabelling< _TInputImage, _TLabelImage, _TTraits >:: TInputValue CTBronchi::MoriLabelling< _TInputImage, _TLabelImage, _TTraits >:: GetUpperThreshold( ) const { const TThresholdFunction* func = dynamic_cast< const TThresholdFunction* >( this->GetValuePredicate( ) ); if( func != NULL ) return( func->GetUpper( ) ); else return( TInputValue( 0 ) ); } // ------------------------------------------------------------------------- template< class _TInputImage, class _TLabelImage, class _TTraits > void CTBronchi::MoriLabelling< _TInputImage, _TLabelImage, _TTraits >:: SetUpperThreshold( TInputValue t ) { TThresholdFunction* func = dynamic_cast< TThresholdFunction* >( this->GetValuePredicate( ) ); if( func != NULL ) func->SetUpper( t ); } // ------------------------------------------------------------------------- template< class _TInputImage, class _TLabelImage, class _TTraits > typename CTBronchi::MoriLabelling< _TInputImage, _TLabelImage, _TTraits >:: TOutputValue CTBronchi::MoriLabelling< _TInputImage, _TLabelImage, _TTraits >:: GetOutsideValue( ) const { return( this->GetInitValue( ) ); } // ------------------------------------------------------------------------- template< class _TInputImage, class _TLabelImage, class _TTraits > void CTBronchi::MoriLabelling< _TInputImage, _TLabelImage, _TTraits >:: SetOutsideLabel( TOutputValue o ) { this->SetInitValue( o ); } // ------------------------------------------------------------------------- template< class _TInputImage, class _TLabelImage, class _TTraits > CTBronchi::MoriLabelling< _TInputImage, _TLabelImage, _TTraits >:: MoriLabelling( ) : Superclass( ), m_InsideLabel( TOutputValue( 0 ) ) { typename TThresholdFunction::Pointer func = TThresholdFunction::New( ); this->SetPredicate( func ); } // ------------------------------------------------------------------------- template< class _TInputImage, class _TLabelImage, class _TTraits > CTBronchi::MoriLabelling< _TInputImage, _TLabelImage, _TTraits >:: ~MoriLabelling( ) { } // ------------------------------------------------------------------------- template< class _TInputImage, class _TLabelImage, class _TTraits > typename CTBronchi::MoriLabelling< _TInputImage, _TLabelImage, _TTraits >:: TNodes CTBronchi::MoriLabelling< _TInputImage, _TLabelImage, _TTraits >:: _UnifySeeds( ) { this->m_Seeds.clear( ); const TLabelImage* lbl = this->GetLabels( ); if( lbl == NULL ) { std::ostringstream msg; msg << "itk::ERROR: CTBronchi::MoriLabelling (" << this << "): Labelled image not defined."; ::itk::ExceptionObject e( __FILE__, __LINE__, msg.str( ).c_str( ), ITK_LOCATION ); throw e; } // fi // Iterate over labels typename TLabelImage::RegionType reg = lbl->GetRequestedRegion( ); itk::ImageRegionConstIteratorWithIndex< TLabelImage > lIt( lbl, reg ); for( lIt.GoToBegin( ); !lIt.IsAtEnd( ); ++lIt ) { if( lIt.Get( ) > 0 ) { bool is_seed = false; for( unsigned int d = 0; d < TLabelImage::ImageDimension; ++d ) { for( int s = -1; s <= 1; s += 2 ) { TVertex neigh = lIt.GetIndex( ); neigh[ d ] += s; if( reg.IsInside( neigh ) ) is_seed |= ( lbl->GetPixel( neigh ) == 0 ); } // rof } // rof if( !is_seed ) { typename TSeedsInterface::TNode node; node.Vertex = lIt.GetIndex( ); node.Parent = lIt.GetIndex( ); node.FrontId = lIt.Get( ); node.Value = this->m_InsideLabel; this->_Mark( node.Vertex, node.FrontId ); this->_UpdateOutputValue( node ); } else { typename TSeedsInterface::TSeed seed; seed.Vertex = lIt.GetIndex( ); seed.IsPoint = false; seed.FrontId = lIt.Get( ); this->m_Seeds.push_back( seed ); } // fi } // fi } // rof // Ok, finish initialization return( this->Superclass::_UnifySeeds( ) ); } // ------------------------------------------------------------------------- template< class _TInputImage, class _TLabelImage, class _TTraits > void CTBronchi::MoriLabelling< _TInputImage, _TLabelImage, _TTraits >:: _UpdateOutputValue( TNode& n ) { const TLabelImage* input_labels = this->GetInputLabelImage( ); this->Superclass::_UpdateOutputValue( n ); if( n.FrontId != 0 ) { if( input_labels->GetPixel( n.Vertex ) == this->GetInsideValue( ) ) n.Value = this->GetInsideLabel( ); else n.Value = TOutputValue( 0 ); this->TAlgorithm::_UpdateOutputValue( n ); } // fi } #endif // __CTBronchi__MoriLabelling__hxx__ // eof - $RCSfile$