X-Git-Url: https://git.creatis.insa-lyon.fr/pubgit/?a=blobdiff_plain;f=lib%2Ffpa%2FImage%2FAlgorithm.hxx;h=ed7342130ba2389b6c64bbbac1dfc3208259ae01;hb=026b2fe203089e1917ab78ebafb3131f147223f5;hp=2eda502c0236bdf6fff65d43227f57d87cbae5ae;hpb=8fafb83c41ab35dfc25eb637170882a612924433;p=FrontAlgorithms.git diff --git a/lib/fpa/Image/Algorithm.hxx b/lib/fpa/Image/Algorithm.hxx index 2eda502..ed73421 100644 --- a/lib/fpa/Image/Algorithm.hxx +++ b/lib/fpa/Image/Algorithm.hxx @@ -1,145 +1,123 @@ -#ifndef __FPA__IMAGE__ALGORITHM__HXX__ -#define __FPA__IMAGE__ALGORITHM__HXX__ +#ifndef __fpa__Image__Algorithm__hxx__ +#define __fpa__Image__Algorithm__hxx__ -#include -#include +// Send Piotr's code to Anna + +#include +#include // ------------------------------------------------------------------------- -template< class I, class O, class A > -fpa::Image::Algorithm< I, O, A >:: +template< class _TInputImage, class _TOutputImage > +fpa::Image::Algorithm< _TInputImage, _TOutputImage >:: Algorithm( ) - : Superclass( ), - m_NeighborhoodOrder( 1 ) + : Superclass( ) { + typedef itk::ImageBase< _TInputImage::ImageDimension > _TImageBase; + typedef fpa::Image::Functors::SimpleNeighborhood< _TImageBase > _TNeigh; + typedef itk::Image< TFrontId, _TInputImage::ImageDimension > _TMarks; + + this->m_MarksIdx = this->GetNumberOfRequiredOutputs( ); + this->itk::ProcessObject::SetNumberOfRequiredOutputs( this->m_MarksIdx + 1 ); + typename _TMarks::Pointer marks = _TMarks::New( ); + this->SetNthOutput( this->m_MarksIdx, marks ); + + typename _TNeigh::Pointer neigh = _TNeigh::New( ); + this->SetNeighborhoodFunction( neigh ); } // ------------------------------------------------------------------------- -template< class I, class O, class A > -fpa::Image::Algorithm< I, O, A >:: +template< class _TInputImage, class _TOutputImage > +fpa::Image::Algorithm< _TInputImage, _TOutputImage >:: ~Algorithm( ) { } // ------------------------------------------------------------------------- -template< class I, class O, class A > -void fpa::Image::Algorithm< I, O, A >:: +template< class _TInputImage, class _TOutputImage > +void fpa::Image::Algorithm< _TInputImage, _TOutputImage >:: _BeforeGenerateData( ) { this->Superclass::_BeforeGenerateData( ); this->AllocateOutputs( ); -} - -// ------------------------------------------------------------------------- -template< class I, class O, class A > -unsigned long fpa::Image::Algorithm< I, O, A >:: -_NumberOfVertices( ) const -{ - return( this->GetInput( )->GetRequestedRegion( ).GetNumberOfPixels( ) ); -} -// ------------------------------------------------------------------------- -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 ) ); + TNeighborhoodFunction* neighFunc = + dynamic_cast< TNeighborhoodFunction* >( + this->GetNeighborhoodFunction( ) + ); + if( neighFunc == NULL ) + itkExceptionMacro( << "NeighborhoodFunction not well defined." ); + neighFunc->SetImage( this->GetInput( ) ); } // ------------------------------------------------------------------------- -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 > +void fpa::Image::Algorithm< _TInputImage, _TOutputImage >:: +_InitMarks( ) { - typename I::PointType pa, pb; - this->GetInput( )->TransformIndexToPhysicalPoint( a, pa ); - this->GetInput( )->TransformIndexToPhysicalPoint( b, pb ); - return( double( pa.EuclideanDistanceTo( pb ) ) ); + typedef itk::Image< TFrontId, _TInputImage::ImageDimension > _TMarks; + _TMarks* marks = + dynamic_cast< _TMarks* >( + this->itk::ProcessObject::GetOutput( this->m_MarksIdx ) + ); + marks->FillBuffer( 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 > +void fpa::Image::Algorithm< _TInputImage, _TOutputImage >:: +_InitResults( const TOutput& init_value ) { - 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 ); - else - return( dist <= I::ImageDimension ); + this->GetOutput( )->FillBuffer( init_value ); } // ------------------------------------------------------------------------- -template< class I, class O, class A > -void fpa::Image::Algorithm< I, O, A >:: -_Neighborhood( _TVertices& neighborhood, const TVertex& v ) const +template< class _TInputImage, class _TOutputImage > +bool fpa::Image::Algorithm< _TInputImage, _TOutputImage >:: +_IsMarked( 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( int i = -1; i <= 1; i += 2 ) - { - TVertex n = v; - n[ d ] += i; - if( reg.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 + typedef itk::Image< TFrontId, _TInputImage::ImageDimension > _TMarks; + const _TMarks* marks = + dynamic_cast< const _TMarks* >( + this->itk::ProcessObject::GetOutput( this->m_MarksIdx ) + ); + return( marks->GetPixel( v ) != 0 ); } // ------------------------------------------------------------------------- -template< class I, class O, class A > -void fpa::Image::Algorithm< I, O, A >:: -_InitResults( ) +template< class _TInputImage, class _TOutputImage > +void fpa::Image::Algorithm< _TInputImage, _TOutputImage >:: +_Mark( const _TQueueNode& n ) { + typedef itk::Image< TFrontId, _TInputImage::ImageDimension > _TMarks; + _TMarks* marks = + dynamic_cast< _TMarks* >( + this->itk::ProcessObject::GetOutput( this->m_MarksIdx ) + ); + marks->SetPixel( n.Vertex, n.FrontId ); } // ------------------------------------------------------------------------- -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 > +typename fpa::Image::Algorithm< _TInputImage, _TOutputImage >:: +TFrontId fpa::Image::Algorithm< _TInputImage, _TOutputImage >:: +_GetMark( const TVertex& v ) const { - return( this->GetOutput( )->GetPixel( v ) ); + typedef itk::Image< TFrontId, _TInputImage::ImageDimension > _TMarks; + const _TMarks* marks = + dynamic_cast< const _TMarks* >( + this->itk::ProcessObject::GetOutput( this->m_MarksIdx ) + ); + return( marks->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 > +void fpa::Image::Algorithm< _TInputImage, _TOutputImage >:: +_UpdateResult( const _TQueueNode& n ) { - this->Superclass::_SetResult( v, n ); - this->GetOutput( )->SetPixel( v, n.Result ); + this->GetOutput( )->SetPixel( n.Vertex, n.Result ); } -#endif // __FPA__IMAGE__ALGORITHM__HXX__ +#endif // __fpa__Image__Algorithm__hxx__ // eof - $RCSfile$