]> Creatis software - cpPlugins.git/blob - plugins/ITKSliceFilters/IsoResampleImageFilter.cxx
...
[cpPlugins.git] / plugins / ITKSliceFilters / IsoResampleImageFilter.cxx
1 #include <ITKSliceFilters/IsoResampleImageFilter.h>
2 #include <ITKImageInterpolators/InterpolateImageFunction.h>
3
4 #include <cpInstances/DataObjects/Image.h>
5 #include <itkImage.h>
6 #include <itkResampleImageFilter.h>
7 #include <itkIdentityTransform.h>
8
9 // -------------------------------------------------------------------------
10 cpPluginsITKSliceFilters::IsoResampleImageFilter::
11 IsoResampleImageFilter( )
12   : Superclass( )
13 {
14   this->_ConfigureInput< cpInstances::DataObjects::Image >( "Input", true, false );
15   this->_ConfigureInput< cpPlugins::Pipeline::DataObject >( "Interpolator", false, false );
16   this->_ConfigureOutput< cpInstances::DataObjects::Image >( "Output" );
17
18   this->m_Parameters.ConfigureAsReal( "Scale", 1 );
19   this->m_Parameters.ConfigureAsBool( "ScaleFromMinimumSpacing", true );
20   this->m_Parameters.ConfigureAsRealTypesChoices( "PrecisionType" );
21 }
22
23 // -------------------------------------------------------------------------
24 cpPluginsITKSliceFilters::IsoResampleImageFilter::
25 ~IsoResampleImageFilter( )
26 {
27 }
28
29 // -------------------------------------------------------------------------
30 void cpPluginsITKSliceFilters::IsoResampleImageFilter::
31 _GenerateData( )
32 {
33   auto o = this->GetInputData( "Input" );
34   cpPlugins_Demangle_Image_ScalarPixels_AllDims_1( o, _GD0 )
35     this->_Error( "Invalid input image." );
36 }
37
38 // -------------------------------------------------------------------------
39 template< class _TImage >
40 void cpPluginsITKSliceFilters::IsoResampleImageFilter::
41 _GD0( _TImage* image )
42 {
43   typedef cpPluginsITKImageInterpolators::InterpolateImageFunction _TInterpolator;
44
45   std::string p_type = this->m_Parameters.GetSelectedChoice( "PrecisionType" );
46   auto interpolator = dynamic_cast< _TInterpolator* >(
47     this->GetInput( "Interpolator" )->GetSource( )
48     );
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 );
53 }
54
55 // -------------------------------------------------------------------------
56 template< class _TImage, class _TScalar >
57 void cpPluginsITKSliceFilters::IsoResampleImageFilter::
58 _GD1( _TImage* image )
59 {
60   typedef itk::IdentityTransform< _TScalar, _TImage::ImageDimension > _TTransform;
61   typedef itk::ResampleImageFilter< _TImage, _TImage, _TScalar, _TScalar > _TFilter;
62   typedef typename _TFilter::InterpolatorType _TInterpolator;
63
64   // Initial configuration
65   auto filter = this->_CreateITK< _TFilter >( );
66   filter->SetInput( image );
67
68   // Associate transform
69   typename _TTransform::Pointer transform = _TTransform::New( );
70   transform->SetIdentity( );
71   filter->SetTransform( transform );
72
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;
79   else
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 );
86
87   // Compute new size
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
93       );
94   filter->SetSize( out_size );
95
96   // New origin
97   filter->SetOutputOrigin( image->GetOrigin( ) );
98
99   // Set interpolator
100   auto interpolator = this->GetInputData< _TInterpolator >( "Interpolator" );
101   if( interpolator != NULL )
102     filter->SetInterpolator( interpolator );
103
104   // Update
105   filter->Update( );
106   this->GetOutput( "Output" )->SetITK( filter->GetOutput( ) );
107 }
108
109 // eof - $RCSfile$