X-Git-Url: https://git.creatis.insa-lyon.fr/pubgit/?a=blobdiff_plain;f=appli%2FCTBronchi%2FMoriLabelling.hxx;h=b6f982a5f4f8e2b31cf542939d154d2be3d0f896;hb=HEAD;hp=6f7246cbced10880b7c220f963b3c5742cdc7f00;hpb=3bfac8d84c19e24fce4d479e7f332aefdba9abf7;p=FrontAlgorithms.git diff --git a/appli/CTBronchi/MoriLabelling.hxx b/appli/CTBronchi/MoriLabelling.hxx index 6f7246c..b6f982a 100644 --- a/appli/CTBronchi/MoriLabelling.hxx +++ b/appli/CTBronchi/MoriLabelling.hxx @@ -6,189 +6,107 @@ #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 >:: +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 ) ); + return( this->m_Functor->GetUpperThreshold( ) ); } // ------------------------------------------------------------------------- -template< class _TInputImage, class _TLabelImage, class _TTraits > -void CTBronchi::MoriLabelling< _TInputImage, _TLabelImage, _TTraits >:: +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, class _TTraits > -typename CTBronchi::MoriLabelling< _TInputImage, _TLabelImage, _TTraits >:: -TOutputValue CTBronchi::MoriLabelling< _TInputImage, _TLabelImage, _TTraits >:: -GetOutsideValue( ) const -{ - return( this->GetInitValue( ) ); + this->m_Functor->SetUpperThreshold( t ); } // ------------------------------------------------------------------------- -template< class _TInputImage, class _TLabelImage, class _TTraits > -void CTBronchi::MoriLabelling< _TInputImage, _TLabelImage, _TTraits >:: -SetOutsideLabel( TOutputValue o ) +template< class _TInputImage, class _TLabelImage > +CTBronchi::MoriLabelling< _TInputImage, _TLabelImage >:: +MoriLabelling( ) + : Superclass( ), + m_LastThreshold( TInputValue( 0 ) ) { - this->SetInitValue( o ); + fpaFilterInputConfigureMacro( InputLabels, TLabelImage ); + this->m_Functor = TFunctor::New( ); + this->SetPredicate( this->m_Functor ); } // ------------------------------------------------------------------------- -template< class _TInputImage, class _TLabelImage, class _TTraits > -CTBronchi::MoriLabelling< _TInputImage, _TLabelImage, _TTraits >:: -MoriLabelling( ) - : Superclass( ), - m_InsideLabel( TOutputValue( 0 ) ) +template< class _TInputImage, class _TLabelImage > +CTBronchi::MoriLabelling< _TInputImage, _TLabelImage >:: +~MoriLabelling( ) { - 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 > +const itk::DataObject* +CTBronchi::MoriLabelling< _TInputImage, _TLabelImage >:: +_GetReferenceInput( ) const { + return( this->GetInputLabels( ) ); } // ------------------------------------------------------------------------- -template< class _TInputImage, class _TLabelImage, class _TTraits > -typename CTBronchi::MoriLabelling< _TInputImage, _TLabelImage, _TTraits >:: -TNodes CTBronchi::MoriLabelling< _TInputImage, _TLabelImage, _TTraits >:: -_UnifySeeds( ) +template< class _TInputImage, class _TLabelImage > +void CTBronchi::MoriLabelling< _TInputImage, _TLabelImage >:: +_PostComputeOutputValue( TNode& n ) { - this->m_Seeds.clear( ); - const TLabelImage* lbl = this->GetLabels( ); - if( lbl == NULL ) + this->Superclass::_PostComputeOutputValue( n ); + if( n.Value == this->GetInsideValue( ) ) { - 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; + const _TInputImage* input = this->GetInput( ); + const TLabelImage* labels = this->GetInputLabels( ); + double x = input->GetPixel( n.Vertex ); + /* TODO + double a = std::fabs( x - double( this->m_Functor->GetUpperThreshold( ) ) ); + double b = std::fabs( x - double( this->m_LastThreshold ) ); + */ + if( labels->GetPixel( n.Vertex ) == 0 /* && b < a*/ ) + n.Value = 0; } // 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 ) +namespace CTBronchi { - const TLabelImage* input_labels = this->GetInputLabelImage( ); - - this->Superclass::_UpdateOutputValue( n ); - if( n.FrontId != 0 ) + template< class _TInputPtr, class _TOutputPtr, class _TInputValue > + void Label( + _TOutputPtr& output, + const _TInputPtr& input, const _TOutputPtr& input_labels, + const _TInputValue& last_thr, + std::map< std::string, std::string >& args + ) { - if( input_labels->GetPixel( n.Vertex ) == this->GetInsideValue( ) ) - n.Value = this->GetInsideLabel( ); - else - n.Value = TOutputValue( 0 ); - this->TAlgorithm::_UpdateOutputValue( n ); - - } // fi -} + typedef typename _TInputPtr::ObjectType _TInput; + typedef typename _TOutputPtr::ObjectType _TOutput; + typedef CTBronchi::MoriLabelling< _TInput, _TOutput > _TLabelling; + + typename _TLabelling::Pointer labelling = _TLabelling::New( ); + labelling->SetInput( input ); + labelling->SetInputLabels( input_labels ); + labelling->SetOutsideValue( 2 ); + labelling->SetInsideValue( 1 ); + labelling->SetUpperThreshold( + _TInputValue( std::atof( args[ "labelling_upper_threshold" ].c_str( ) ) ) + ); + labelling->SetLastThreshold( last_thr ); + double t = MeasureTime( labelling ); + std::cout << "Labelling executed in " << t << " s" << std::endl; + output = labelling->GetOutput( ); + std::map< std::string, std::string >::const_iterator i = + args.find( "out_labels" ); + if( i != args.end( ) ) + WriteImage( output, i->second ); + output->DisconnectPipeline( ); + } + +} // ecapseman #endif // __CTBronchi__MoriLabelling__hxx__