#include #include #include #include #include #include // ------------------------------------------------------------------------- cpPluginsITKSliceFilters::IsoResampleImageFilter:: IsoResampleImageFilter( ) : Superclass( ) { this->_ConfigureInput< cpInstances::DataObjects::Image >( "Input", true, false ); this->_ConfigureInput< cpPlugins::Pipeline::DataObject >( "Interpolator", false, false ); this->_ConfigureOutput< cpInstances::DataObjects::Image >( "Output" ); this->m_Parameters.ConfigureAsReal( "Scale", 1 ); this->m_Parameters.ConfigureAsBool( "ScaleFromMinimumSpacing", true ); this->m_Parameters.ConfigureAsRealTypesChoices( "PrecisionType" ); } // ------------------------------------------------------------------------- cpPluginsITKSliceFilters::IsoResampleImageFilter:: ~IsoResampleImageFilter( ) { } // ------------------------------------------------------------------------- void cpPluginsITKSliceFilters::IsoResampleImageFilter:: _GenerateData( ) { auto o = this->GetInputData( "Input" ); cpPlugins_Demangle_Image_ScalarPixels_AllDims_1( o, _GD0 ) this->_Error( "Invalid input image." ); } // ------------------------------------------------------------------------- template< class _TImage > void cpPluginsITKSliceFilters::IsoResampleImageFilter:: _GD0( _TImage* image ) { typedef cpPluginsITKImageInterpolators::InterpolateImageFunction _TInterpolator; std::string p_type = this->m_Parameters.GetSelectedChoice( "PrecisionType" ); auto interpolator = dynamic_cast< _TInterpolator* >( this->GetInput( "Interpolator" )->GetSource( ) ); if( interpolator != NULL ) interpolator->CreateInterpolator( image, p_type ); if ( p_type == "float" ) this->_GD1< _TImage, float >( image ); else if( p_type == "double" ) this->_GD1< _TImage, double >( image ); } // ------------------------------------------------------------------------- template< class _TImage, class _TScalar > void cpPluginsITKSliceFilters::IsoResampleImageFilter:: _GD1( _TImage* image ) { typedef itk::IdentityTransform< _TScalar, _TImage::ImageDimension > _TTransform; typedef itk::ResampleImageFilter< _TImage, _TImage, _TScalar, _TScalar > _TFilter; typedef typename _TFilter::InterpolatorType _TInterpolator; // Initial configuration auto filter = this->_CreateITK< _TFilter >( ); filter->SetInput( image ); // Associate transform typename _TTransform::Pointer transform = _TTransform::New( ); transform->SetIdentity( ); filter->SetTransform( transform ); // Compute new spacing typename _TImage::SpacingType in_spac = image->GetSpacing( ); double val_spac = in_spac[ 0 ]; if( this->m_Parameters.GetBool( "ScaleFromMinimumSpacing" ) ) for( unsigned int d = 1; d < _TImage::ImageDimension; ++d ) val_spac = ( in_spac[ d ] < val_spac )? in_spac[ d ]: val_spac; else for( unsigned int d = 1; d < _TImage::ImageDimension; ++d ) val_spac = ( in_spac[ d ] > val_spac )? in_spac[ d ]: val_spac; val_spac *= this->m_Parameters.GetReal( "Scale" ); typename _TImage::SpacingType out_spac; out_spac.Fill( val_spac ); filter->SetOutputSpacing( out_spac ); // Compute new size typename _TImage::SizeType in_size = image->GetRequestedRegion( ).GetSize( ); typename _TImage::SizeType out_size; for( unsigned int d = 0; d < _TImage::ImageDimension; ++d ) out_size[ d ] = ( unsigned long )( double( in_size[ d ] ) * double( in_spac[ d ] ) / val_spac ); filter->SetSize( out_size ); // New origin filter->SetOutputOrigin( image->GetOrigin( ) ); // Set interpolator auto interpolator = this->GetInputData< _TInterpolator >( "Interpolator" ); if( interpolator != NULL ) filter->SetInterpolator( interpolator ); // Update filter->Update( ); this->GetOutput( "Output" )->SetITK( filter->GetOutput( ) ); } // eof - $RCSfile$