// ========================================================================= // @author Leonardo Florez Valencia // @email florez-l@javeriana.edu.co // ========================================================================= #ifndef __CTBronchi__MoriLabelling__hxx__ #define __CTBronchi__MoriLabelling__hxx__ #include // ------------------------------------------------------------------------- template< class _TInputImage, class _TLabelImage > const typename CTBronchi::MoriLabelling< _TInputImage, _TLabelImage >:: TLabelImage* CTBronchi::MoriLabelling< _TInputImage, _TLabelImage >:: GetInputLabelImage( ) const { return( this->GetLabels( ) ); } // ------------------------------------------------------------------------- template< class _TInputImage, class _TLabelImage > void CTBronchi::MoriLabelling< _TInputImage, _TLabelImage >:: SetInputLabelImage( TLabelImage* image ) { this->SetLabels( image ); } // ------------------------------------------------------------------------- template< class _TInputImage, class _TLabelImage > const typename CTBronchi::MoriLabelling< _TInputImage, _TLabelImage >:: TInputImage* CTBronchi::MoriLabelling< _TInputImage, _TLabelImage >:: GetInputRawImage( ) const { return( this->GetInput( ) ); } // ------------------------------------------------------------------------- template< class _TInputImage, class _TLabelImage > void CTBronchi::MoriLabelling< _TInputImage, _TLabelImage >:: SetInputRawImage( TInputImage* image ) { this->SetInput( image ); } // ------------------------------------------------------------------------- template< class _TInputImage, class _TLabelImage > typename CTBronchi::MoriLabelling< _TInputImage, _TLabelImage >:: TInputValue CTBronchi::MoriLabelling< _TInputImage, _TLabelImage >:: 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 > void CTBronchi::MoriLabelling< _TInputImage, _TLabelImage >:: SetUpperThreshold( TInputValue t ) { TThresholdFunction* func = dynamic_cast< TThresholdFunction* >( this->GetValuePredicate( ) ); if( func != NULL ) func->SetUpper( t ); } // ------------------------------------------------------------------------- template< class _TInputImage, class _TLabelImage > CTBronchi::MoriLabelling< _TInputImage, _TLabelImage >:: MoriLabelling( ) : Superclass( ), m_InsideLabel( TOutputValue( 0 ) ), m_OutsideLabel( TOutputValue( 0 ) ) { typename TThresholdFunction::Pointer func = TThresholdFunction::New( ); this->SetPredicate( func ); } // ------------------------------------------------------------------------- template< class _TInputImage, class _TLabelImage > CTBronchi::MoriLabelling< _TInputImage, _TLabelImage >:: ~MoriLabelling( ) { } // ------------------------------------------------------------------------- template< class _TInputImage, class _TLabelImage > typename CTBronchi::MoriLabelling< _TInputImage, _TLabelImage >:: TNodes CTBronchi::MoriLabelling< _TInputImage, _TLabelImage >:: _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 > void CTBronchi::MoriLabelling< _TInputImage, _TLabelImage >:: _UpdateOutputValue( TNode& n ) { const TInputImage* input = this->GetInputRawImage( ); const TLabelImage* labels = this->GetInputLabelImage( ); } /* TODO TOutputValue m_InsideValue; TOutputValue m_InsideLabel; TOutputValue m_OutsideLabel; */ /* TODO #include #include // ------------------------------------------------------------------------- template< class _TInputImage, class _TLabelImage > const _TLabelImage* CTBronchi::MoriLabelling< _TInputImage, _TLabelImage >:: GetInputLabelImage( ) const { return( this->GetInput( ) ); } // ------------------------------------------------------------------------- template< class _TInputImage, class _TLabelImage > void CTBronchi::MoriLabelling< _TInputImage, _TLabelImage >:: SetInputLabelImage( TLabelImage* image ) { this->SetInput( image ); } // ------------------------------------------------------------------------- template< class _TInputImage, class _TLabelImage > const _TInputImage* CTBronchi::MoriLabelling< _TInputImage, _TLabelImage >:: GetInputRawImage( ) const { return( dynamic_cast< const TInputImage* >( this->itk::ProcessObject::GetInput( 1 ) ) ); } // ------------------------------------------------------------------------- template< class _TInputImage, class _TLabelImage > void CTBronchi::MoriLabelling< _TInputImage, _TLabelImage >:: SetInputRawImage( TInputImage* image ) { this->itk::ProcessObject::SetNthInput( 1, image ); } // ------------------------------------------------------------------------- template< class _TInputImage, class _TLabelImage > CTBronchi::MoriLabelling< _TInputImage, _TLabelImage >:: MoriLabelling( ) : Superclass( ), m_UpperThreshold( TOutputValue( 0 ) ), m_InsideValue( TOutputValue( 0 ) ), m_InsideLabel( TOutputValue( 0 ) ), m_OutsideLabel( TOutputValue( 0 ) ) { this->SetNumberOfRequiredInputs( 2 ); } // ------------------------------------------------------------------------- template< class _TInputImage, class _TLabelImage > CTBronchi::MoriLabelling< _TInputImage, _TLabelImage >:: ~MoriLabelling( ) { } // ------------------------------------------------------------------------- template< class _TInputImage, class _TLabelImage > void CTBronchi::MoriLabelling< _TInputImage, _TLabelImage >:: ThreadedGenerateData( const TRegion& region, itk::ThreadIdType threadId ) { itk::ImageRegionConstIterator< TLabelImage > lIt( this->GetInputLabelImage( ), region ); itk::ImageRegionConstIterator< TInputImage > iIt( this->GetInputRawImage( ), region ); itk::ImageRegionIterator< TLabelImage > oIt( this->GetOutput( ), region ); lIt.GoToBegin( ); iIt.GoToBegin( ); oIt.GoToBegin( ); while( !( lIt.IsAtEnd( ) || iIt.IsAtEnd( ) || oIt.IsAtEnd( ) ) ) { if( lIt.Get( ) != this->m_InsideValue ) { if( this->m_UpperThreshold < iIt.Get( ) ) oIt.Set( this->m_OutsideLabel ); else oIt.Set( TOutputValue( 0 ) ); } else oIt.Set( this->m_InsideLabel ); ++lIt; ++iIt; ++oIt; } // elihw } */ #endif // __CTBronchi__MoriLabelling__hxx__ // eof - $RCSfile$