X-Git-Url: https://git.creatis.insa-lyon.fr/pubgit/?a=blobdiff_plain;f=lib%2Ffpa%2FImage%2FAlgorithm.hxx;h=9ac7548b55c2fbe729b2544f85795de31d541bb2;hb=ed2108383e59a45c6fa2e9259a27256a93d8aa6a;hp=5e8605dcdd04f117c077169a3852a457f5e87945;hpb=6fcc9fc78c44fa789bf092e2897cb6b391259b42;p=FrontAlgorithms.git diff --git a/lib/fpa/Image/Algorithm.hxx b/lib/fpa/Image/Algorithm.hxx index 5e8605d..9ac7548 100644 --- a/lib/fpa/Image/Algorithm.hxx +++ b/lib/fpa/Image/Algorithm.hxx @@ -1,154 +1,219 @@ -#ifndef __FPA__IMAGE__ALGORITHM__HXX__ -#define __FPA__IMAGE__ALGORITHM__HXX__ +// ========================================================================= +// @author Leonardo Florez Valencia +// @email florez-l@javeriana.edu.co +// ========================================================================= -#include -#include +#ifndef __fpa__Image__Algorithm__hxx__ +#define __fpa__Image__Algorithm__hxx__ // ------------------------------------------------------------------------- -template< class I, class O, class A > -fpa::Image::Algorithm< I, O, A >:: -Algorithm( ) - : Superclass( ), - m_NeighborhoodOrder( 1 ) +template< class _TInputImage, class _TOutputImage, class _TMarksInterface, class _TSeedsInterface > +typename +fpa::Image::Algorithm< _TInputImage, _TOutputImage, _TMarksInterface, _TSeedsInterface >:: +TMarks* +fpa::Image::Algorithm< _TInputImage, _TOutputImage, _TMarksInterface, _TSeedsInterface >:: +GetMarks( ) { + return( + dynamic_cast< TMarks* >( + this->itk::ProcessObject::GetOutput( this->m_MarksIdx ) + ) + ); } // ------------------------------------------------------------------------- -template< class I, class O, class A > -fpa::Image::Algorithm< I, O, A >:: -~Algorithm( ) +template< class _TInputImage, class _TOutputImage, class _TMarksInterface, class _TSeedsInterface > +const typename +fpa::Image::Algorithm< _TInputImage, _TOutputImage, _TMarksInterface, _TSeedsInterface >:: +TMarks* +fpa::Image::Algorithm< _TInputImage, _TOutputImage, _TMarksInterface, _TSeedsInterface >:: +GetMarks( ) const { + return( + dynamic_cast< const TMarks* >( + this->itk::ProcessObject::GetOutput( this->m_MarksIdx ) + ) + ); } // ------------------------------------------------------------------------- -template< class I, class O, class A > -void fpa::Image::Algorithm< I, O, A >:: -_BeforeGenerateData( ) +template< class _TInputImage, class _TOutputImage, class _TMarksInterface, class _TSeedsInterface > +fpa::Image::Algorithm< _TInputImage, _TOutputImage, _TMarksInterface, _TSeedsInterface >:: +Algorithm( ) + : Superclass( ), + m_NeigborhoodOrder( 1 ) { - this->Superclass::_BeforeGenerateData( ); - this->AllocateOutputs( ); + this->m_MarksIdx = this->GetNumberOfRequiredOutputs( ); + this->itk::ProcessObject::SetNumberOfRequiredOutputs( this->m_MarksIdx + 1 ); + this->SetNthOutput( this->m_MarksIdx, TMarks::New( ) ); } // ------------------------------------------------------------------------- -template< class I, class O, class A > -void fpa::Image::Algorithm< I, O, A >:: -_AfterGenerateData( ) +template< class _TInputImage, class _TOutputImage, class _TMarksInterface, class _TSeedsInterface > +fpa::Image::Algorithm< _TInputImage, _TOutputImage, _TMarksInterface, _TSeedsInterface >:: +~Algorithm( ) { - this->Superclass::_AfterGenerateData( ); - this->GetMinimumSpanningTree( )->SetCollisions( this->m_Collisions ); } // ------------------------------------------------------------------------- -template< class I, class O, class A > -unsigned long fpa::Image::Algorithm< I, O, A >:: -_NumberOfVertices( ) const +template< class _TInputImage, class _TOutputImage, class _TMarksInterface, class _TSeedsInterface > +typename +fpa::Image::Algorithm< _TInputImage, _TOutputImage, _TMarksInterface, _TSeedsInterface >:: +TNodes fpa::Image::Algorithm< _TInputImage, _TOutputImage, _TMarksInterface, _TSeedsInterface >:: +_UnifySeeds( ) { - return( this->GetInput( )->GetRequestedRegion( ).GetNumberOfPixels( ) ); -} + const TInputImage* input = this->GetInput( ); + typename TInputImage::RegionType region = input->GetRequestedRegion( ); + TSeeds seeds = this->GetSeeds( ); + TNodes nodes; -// ------------------------------------------------------------------------- -template< class I, class O, class A > -const typename fpa::Image::Algorithm< I, O, A >:: -TValue& fpa::Image::Algorithm< I, O, A >:: -_VertexValue( const TVertex& v ) const -{ - return( this->GetInput( )->GetPixel( v ) ); + typename TSeeds::iterator sIt = seeds.begin( ); + for( ; sIt != seeds.end( ); ++sIt ) + { + TNode node; + if( sIt->IsPoint ) + input->TransformPhysicalPointToIndex( sIt->Point, sIt->Vertex ); + else + input->TransformIndexToPhysicalPoint( sIt->Vertex, sIt->Point ); + if( region.IsInside( sIt->Vertex ) ) + { + sIt->IsUnified = true; + node.Vertex = sIt->Vertex; + node.Parent = node.Vertex; + if( sIt->FrontId == 0 ) + node.FrontId = nodes.size( ) + 1; + else + node.FrontId = sIt->FrontId; + nodes.insert( node ); + } + else + sIt->IsUnified = false; + + } // rof + + return( nodes ); } // ------------------------------------------------------------------------- -template< class I, class O, class A > -double fpa::Image::Algorithm< I, O, A >:: -_Distance( const TVertex& a, const TVertex& b ) const +template< class _TInputImage, class _TOutputImage, class _TMarksInterface, class _TSeedsInterface > +void +fpa::Image::Algorithm< _TInputImage, _TOutputImage, _TMarksInterface, _TSeedsInterface >:: +_ConfigureOutput( const TOutputValue& v ) { - typename I::PointType pa, pb; - this->GetInput( )->TransformIndexToPhysicalPoint( a, pa ); - this->GetInput( )->TransformIndexToPhysicalPoint( b, pb ); - return( double( pa.EuclideanDistanceTo( pb ) ) ); + const TInputImage* in = this->GetInput( ); + + TOutputImage* out = this->GetOutput( ); + out->SetLargestPossibleRegion( in->GetLargestPossibleRegion( ) ); + out->SetRequestedRegion( in->GetRequestedRegion( ) ); + out->SetBufferedRegion( in->GetBufferedRegion( ) ); + out->SetSpacing( in->GetSpacing( ) ); + out->SetOrigin( in->GetOrigin( ) ); + out->SetDirection( in->GetDirection( ) ); + out->Allocate( ); + out->FillBuffer( v ); + + TMarks* marks = this->GetMarks( ); + marks->SetLargestPossibleRegion( in->GetLargestPossibleRegion( ) ); + marks->SetRequestedRegion( in->GetRequestedRegion( ) ); + marks->SetBufferedRegion( in->GetBufferedRegion( ) ); + marks->SetSpacing( in->GetSpacing( ) ); + marks->SetOrigin( in->GetOrigin( ) ); + marks->SetDirection( in->GetDirection( ) ); + marks->Allocate( ); + marks->FillBuffer( TFrontId( 0 ) ); } // ------------------------------------------------------------------------- -template< class I, class O, class A > -bool fpa::Image::Algorithm< I, O, A >:: -_HasEdge( const TVertex& a, const TVertex& b ) const +template< class _TInputImage, class _TOutputImage, class _TMarksInterface, class _TSeedsInterface > +typename +fpa::Image::Algorithm< _TInputImage, _TOutputImage, _TMarksInterface, _TSeedsInterface >:: +TNeighborhood fpa::Image::Algorithm< _TInputImage, _TOutputImage, _TMarksInterface, _TSeedsInterface >:: +_GetNeighbors( const TVertex& v ) const { - unsigned long dist = 0; - for( unsigned int d = 0; d < I::ImageDimension; d++ ) - dist += std::abs( long( a[ d ] ) - long( b[ d ] ) ); - if( this->m_NeighborhoodOrder == 1 ) - return( dist <= 1 ); + typename TInputImage::RegionType region = + this->GetInput( )->GetRequestedRegion( ); + TNeighborhood neighborhood; + if( this->m_NeigborhoodOrder != 1 ) + { + // TODO + } else - return( dist <= I::ImageDimension ); -} - -// ------------------------------------------------------------------------- -template< class I, class O, class A > -void fpa::Image::Algorithm< I, O, A >:: -_Neighborhood( _TVertices& neighborhood, const TVertex& v ) const -{ - typename I::RegionType reg = this->GetInput( )->GetRequestedRegion( ); - - neighborhood.clear( ); - if( this->m_NeighborhoodOrder == 1 ) { - for( unsigned int d = 0; d < I::ImageDimension; d++ ) + for( unsigned int d = 0; d < TInputImage::ImageDimension; ++d ) { - for( int i = -1; i <= 1; i += 2 ) + for( int s = -1; s <= 1; s += 2 ) { TVertex n = v; - n[ d ] += i; - if( reg.IsInside( n ) ) + n[ d ] += s; + if( region.IsInside( n ) ) neighborhood.push_back( n ); } // rof } // rof - } - else - { - typedef itk::ConstNeighborhoodIterator< I > TNeighIt; - typename I::SizeType nSize; - nSize.Fill( 1 ); - - TNeighIt nIt( nSize, this->GetInput( ), reg ); - nIt.SetLocation( v ); - for( unsigned int i = 0; i < nIt.Size( ); i++ ) - { - TVertex n = nIt.GetIndex( i ); - if( n == v ) - continue; - if( reg.IsInside( n ) ) - neighborhood.push_back( n ); - - } // rof } // fi + return( neighborhood ); } // ------------------------------------------------------------------------- -template< class I, class O, class A > -void fpa::Image::Algorithm< I, O, A >:: -_InitResults( ) +template< class _TInputImage, class _TOutputImage, class _TMarksInterface, class _TSeedsInterface > +typename +fpa::Image::Algorithm< _TInputImage, _TOutputImage, _TMarksInterface, _TSeedsInterface >:: +TInputValue +fpa::Image::Algorithm< _TInputImage, _TOutputImage, _TMarksInterface, _TSeedsInterface >:: +_GetInputValue( const TVertex& v ) const { + return( this->GetInput( )->GetPixel( v ) ); } // ------------------------------------------------------------------------- -template< class I, class O, class A > -const typename fpa::Image::Algorithm< I, O, A >:: -TResult& fpa::Image::Algorithm< I, O, A >:: -_Result( const TVertex& v ) const +template< class _TInputImage, class _TOutputImage, class _TMarksInterface, class _TSeedsInterface > +typename +fpa::Image::Algorithm< _TInputImage, _TOutputImage, _TMarksInterface, _TSeedsInterface >:: +TOutputValue fpa::Image::Algorithm< _TInputImage, _TOutputImage, _TMarksInterface, _TSeedsInterface >:: +_GetOutputValue( const TVertex& v ) const { return( this->GetOutput( )->GetPixel( v ) ); } // ------------------------------------------------------------------------- -template< class I, class O, class A > -void fpa::Image::Algorithm< I, O, A >:: -_SetResult( const TVertex& v, const _TNode& n ) +template< class _TInputImage, class _TOutputImage, class _TMarksInterface, class _TSeedsInterface > +void +fpa::Image::Algorithm< _TInputImage, _TOutputImage, _TMarksInterface, _TSeedsInterface >:: +_UpdateOutputValue( const TNode& n ) +{ + this->GetOutput( )->SetPixel( n.Vertex, n.Value ); +} + +// ------------------------------------------------------------------------- +template< class _TInputImage, class _TOutputImage, class _TMarksInterface, class _TSeedsInterface > +bool +fpa::Image::Algorithm< _TInputImage, _TOutputImage, _TMarksInterface, _TSeedsInterface >:: +_IsMarked( const TVertex& v ) const +{ + return( this->GetMarks( )->GetPixel( v ) > 0 ); +} + +// ------------------------------------------------------------------------- +template< class _TInputImage, class _TOutputImage, class _TMarksInterface, class _TSeedsInterface > +unsigned long +fpa::Image::Algorithm< _TInputImage, _TOutputImage, _TMarksInterface, _TSeedsInterface >:: +_GetMark( const TVertex& v ) const +{ + return( ( unsigned long )( this->GetMarks( )->GetPixel( v ) ) ); +} + +// ------------------------------------------------------------------------- +template< class _TInputImage, class _TOutputImage, class _TMarksInterface, class _TSeedsInterface > +bool +fpa::Image::Algorithm< _TInputImage, _TOutputImage, _TMarksInterface, _TSeedsInterface >:: +_Mark( const TVertex& v, unsigned long frontId ) { - this->GetOutput( )->SetPixel( v, n.Result ); - this->GetMinimumSpanningTree( )->SetParent( v, n.Parent, n.FrontId ); + this->GetMarks( )->SetPixel( v, TFrontId( frontId ) ); + return( true ); } -#endif // __FPA__IMAGE__ALGORITHM__HXX__ +#endif // __fpa__Image__Algorithm__hxx__ // eof - $RCSfile$