1 #include <ITKSliceFilters/IsoResampleImageFilter.h>
2 #include <ITKImageInterpolators/InterpolateImageFunction.h>
4 #include <cpInstances/Image.h>
6 #include <itkResampleImageFilter.h>
7 #include <itkIdentityTransform.h>
9 // -------------------------------------------------------------------------
10 cpPluginsITKSliceFilters::IsoResampleImageFilter::
11 IsoResampleImageFilter( )
14 this->_ConfigureInput< cpInstances::Image >( "Input", true, false );
15 this->_ConfigureInput< cpPlugins::BaseObjects::DataObject >( "Interpolator", false, false );
16 this->_ConfigureOutput< cpInstances::Image >( "Output" );
18 this->m_Parameters.ConfigureAsReal( "Scale", 1 );
19 this->m_Parameters.ConfigureAsBool( "ScaleFromMinimumSpacing", true );
20 this->m_Parameters.ConfigureAsRealTypesChoices( "PrecisionType" );
23 // -------------------------------------------------------------------------
24 cpPluginsITKSliceFilters::IsoResampleImageFilter::
25 ~IsoResampleImageFilter( )
29 // -------------------------------------------------------------------------
30 void cpPluginsITKSliceFilters::IsoResampleImageFilter::
33 auto o = this->GetInputData( "Input" );
34 cpPlugins_Demangle_Image_ScalarPixels_AllDims_1( o, _GD0 )
35 this->_Error( "Invalid input image." );
38 // -------------------------------------------------------------------------
39 template< class _TImage >
40 void cpPluginsITKSliceFilters::IsoResampleImageFilter::
41 _GD0( _TImage* image )
43 typedef cpPluginsITKImageInterpolators::InterpolateImageFunction _TInterpolator;
45 std::string p_type = this->m_Parameters.GetSelectedChoice( "PrecisionType" );
46 auto interpolator = dynamic_cast< _TInterpolator* >(
47 this->GetInput( "Interpolator" )->GetSource( )
49 if( interpolator != NULL )
50 interpolator->CreateInterpolator( image, p_type );
51 if ( p_type == "float" ) this->_GD1< _TImage, float >( image );
52 else if( p_type == "double" ) this->_GD1< _TImage, double >( image );
55 // -------------------------------------------------------------------------
56 template< class _TImage, class _TScalar >
57 void cpPluginsITKSliceFilters::IsoResampleImageFilter::
58 _GD1( _TImage* image )
60 typedef itk::IdentityTransform< _TScalar, _TImage::ImageDimension > _TTransform;
61 typedef itk::ResampleImageFilter< _TImage, _TImage, _TScalar, _TScalar > _TFilter;
62 typedef typename _TFilter::InterpolatorType _TInterpolator;
64 // Initial configuration
65 auto filter = this->_CreateITK< _TFilter >( );
66 filter->SetInput( image );
68 // Associate transform
69 typename _TTransform::Pointer transform = _TTransform::New( );
70 transform->SetIdentity( );
71 filter->SetTransform( transform );
73 // Compute new spacing
74 typename _TImage::SpacingType in_spac = image->GetSpacing( );
75 double val_spac = in_spac[ 0 ];
76 if( this->m_Parameters.GetBool( "ScaleFromMinimumSpacing" ) )
77 for( unsigned int d = 1; d < _TImage::ImageDimension; ++d )
78 val_spac = ( in_spac[ d ] < val_spac )? in_spac[ d ]: val_spac;
80 for( unsigned int d = 1; d < _TImage::ImageDimension; ++d )
81 val_spac = ( in_spac[ d ] > val_spac )? in_spac[ d ]: val_spac;
82 val_spac *= this->m_Parameters.GetReal( "Scale" );
83 typename _TImage::SpacingType out_spac;
84 out_spac.Fill( val_spac );
85 filter->SetOutputSpacing( out_spac );
88 typename _TImage::SizeType in_size = image->GetRequestedRegion( ).GetSize( );
89 typename _TImage::SizeType out_size;
90 for( unsigned int d = 0; d < _TImage::ImageDimension; ++d )
91 out_size[ d ] = ( unsigned long )(
92 double( in_size[ d ] ) * double( in_spac[ d ] ) / val_spac
94 filter->SetSize( out_size );
97 filter->SetOutputOrigin( image->GetOrigin( ) );
100 auto interpolator = this->GetInputData< _TInterpolator >( "Interpolator" );
101 if( interpolator != NULL )
102 filter->SetInterpolator( interpolator );
106 this->GetOutput( "Output" )->SetITK( filter->GetOutput( ) );