#ifndef __cpExtensions__Algorithms__CPRImageFilter__hxx__
#define __cpExtensions__Algorithms__CPRImageFilter__hxx__
-#include <itkImageRegionIterator.h>
-#include <itkImageSliceIteratorWithIndex.h>
#include <itkMinimumMaximumImageCalculator.h>
// -------------------------------------------------------------------------
void cpExtensions::Algorithms::CPRImageFilter< _TImage, _TCurve >::
GenerateData( )
{
- typedef itk::MinimumMaximumImageCalculator< _TImage > _TMinMax;
- typedef itk::ImageSliceIteratorWithIndex< _TImage > _T3DIt;
- typedef itk::ImageRegionIterator< typename TSlicer::TSliceImage > _T2DIt;
+ typedef itk::MinimumMaximumImageCalculator< _TImage > _TMinMax;
auto input = this->GetInput( );
auto curve = this->GetCurve( );
minmax->SetImage( input );
minmax->Compute( );
- // Prepare slicer
- typename TSlicer::Pointer slicer = TSlicer::New( );
- slicer->SetInput( input );
- slicer->SetDefaultValue( minmax->GetMinimum( ) );
- slicer->SpacingFromMinimumOn( );
- if( this->m_Interpolator.IsNotNull( ) )
- slicer->SetInterpolator( this->m_Interpolator );
- slicer->SizeFromMaximumOff( );
- if( this->m_SliceRadius > double( 0 ) )
- {
- slicer->SizeFromMinimumOff( );
- slicer->SetSize( this->m_SliceRadius );
- }
- else
- slicer->SizeFromMinimumOn( );
-
- // Slice image
- _T3DIt oIt( output, output->GetRequestedRegion( ) );
- oIt.SetFirstDirection( 1 );
- oIt.SetSecondDirection( 2 );
- oIt.GoToBegin( );
+ // Main loop
+ this->m_Join = TJoinFilter::New( );
+ this->m_Slicers.clear( );
unsigned long N = curve->GetNumberOfPoints( );
+ double len = 0;
+ typename _TCurve::TPoint p, q;
for( unsigned long n = 0; n < N; ++n )
{
- slicer->SetTranslation( curve->GetPoint( n ) );
+ p = curve->GetPoint( n );
+ if( n > 0 )
+ len += p.EuclideanDistanceTo( q );
+ q = p;
+
+ // Prepare slicer
+ typename TSlicer::Pointer slicer = TSlicer::New( );
+ slicer->SetInput( input );
+ slicer->SetDefaultValue( minmax->GetMinimum( ) );
+ slicer->SpacingFromMinimumOn( );
+ if( this->m_Interpolator.IsNotNull( ) )
+ slicer->SetInterpolator( this->m_Interpolator );
+ slicer->SizeFromMaximumOff( );
+ if( this->m_SliceRadius > double( 0 ) )
+ {
+ slicer->SizeFromMinimumOff( );
+ slicer->SetSize( this->m_SliceRadius );
+ }
+ else
+ slicer->SizeFromMinimumOn( );
+ slicer->SetTranslation( p );
slicer->SetRotation( curve->GetFrame( n ) );
slicer->Update( );
- // Fill output image
- _T2DIt sIt(
- slicer->GetOutput( ), slicer->GetOutput( )->GetRequestedRegion( )
- );
- for( sIt.GoToBegin( ); !sIt.IsAtEnd( ); ++sIt )
- {
- oIt.Set( sIt.Get( ) );
- ++oIt;
- if( oIt.IsAtEndOfLine( ) )
- oIt.NextLine( );
- if( oIt.IsAtEndOfSlice( ) )
- oIt.NextSlice( );
-
- } // rof
+ this->m_Join->SetInput( n, slicer->GetOutput( ) );
+ this->m_Slicers.push_back( slicer );
} // rof
+ this->m_Join->SetSpacing( len / double( N ) );
+ this->m_Join->Update( );
+ this->GetOutput( )->Graft( this->m_Join->GetOutput( ) );
}
#endif // __cpExtensions__Algorithms__CPRImageFilter__hxx__