]> Creatis software - cpPlugins.git/blobdiff - plugins/ITKSliceFilters/IsoResampleImageFilter.cxx
yet another refactoring
[cpPlugins.git] / plugins / ITKSliceFilters / IsoResampleImageFilter.cxx
diff --git a/plugins/ITKSliceFilters/IsoResampleImageFilter.cxx b/plugins/ITKSliceFilters/IsoResampleImageFilter.cxx
new file mode 100644 (file)
index 0000000..0e451db
--- /dev/null
@@ -0,0 +1,109 @@
+#include <ITKSliceFilters/IsoResampleImageFilter.h>
+#include <ITKImageInterpolators/InterpolateImageFunction.h>
+
+#include <cpInstances/DataObjects/Image.h>
+#include <itkImage.h>
+#include <itkResampleImageFilter.h>
+#include <itkIdentityTransform.h>
+
+// -------------------------------------------------------------------------
+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$