1 #include <ImageSliceFilters/ResampleImageFilter.h>
2 #include <cpPlugins/DataObjects/Image.h>
5 #include <itkResampleImageFilter.h>
6 #include <itkIdentityTransform.h>
8 // -------------------------------------------------------------------------
9 cpPluginsImageSliceFilters::ResampleImageFilter::
10 ResampleImageFilter( )
13 typedef cpPlugins::DataObjects::Image _TImage;
14 this->_ConfigureInput< _TImage >( "Image", true, false );
15 this->_ConfigureOutput< _TImage >( "Output" );
17 this->m_Parameters.ConfigureAsReal( "ReductionFactor", 1 );
20 // -------------------------------------------------------------------------
21 cpPluginsImageSliceFilters::ResampleImageFilter::
22 ~ResampleImageFilter( )
26 // -------------------------------------------------------------------------
27 void cpPluginsImageSliceFilters::ResampleImageFilter::
30 auto o = this->GetInputData( "Image" );
31 cpPlugins_Demangle_Image_ScalarPixels_1( o, _GD0, 3 )
32 this->_Error( "Invalid input image." );
35 // -------------------------------------------------------------------------
36 template< class _TImage >
37 void cpPluginsImageSliceFilters::ResampleImageFilter::
38 _GD0( _TImage* image )
40 typedef itk::ResampleImageFilter< _TImage, _TImage > _TFilter;
41 typedef itk::IdentityTransform< double, _TImage::ImageDimension > _TTransform;
43 double r = this->m_Parameters.GetReal( "ReductionFactor" );
45 typename _TImage::SizeType in_size = image->GetRequestedRegion( ).GetSize( );
46 typename _TImage::SizeType out_size;
47 for( unsigned int d = 0; d < _TImage::ImageDimension; ++d )
49 ( unsigned long )( /*std::ceil*/( double( in_size[ d ] ) * r ) );
51 typename _TImage::SpacingType in_spac = image->GetSpacing( );
52 typename _TImage::SpacingType out_spac;
53 for( unsigned int d = 0; d < _TImage::ImageDimension; ++d )
54 out_spac[ d ] = in_spac[ d ] * ( double( in_size[ d ] ) / double( out_size[ d ] ) );
56 typename _TImage::IndexType idx;
59 auto filter = this->_CreateITK< _TFilter >( );
60 filter->SetInput( image );
61 filter->SetDefaultPixelValue( 100 );
62 filter->SetSize( out_size );
63 filter->SetOutputSpacing( out_spac );
64 filter->SetOutputOrigin( image->GetOrigin( ) );
65 filter->SetOutputDirection( image->GetDirection( ) );
66 filter->SetOutputStartIndex( idx );
67 filter->SetTransform( _TTransform::New( ) );
68 filter->UpdateLargestPossibleRegion( );
70 this->GetOutput( "Output" )->SetITK( filter->GetOutput( ) );