]> Creatis software - cpPlugins.git/blob - plugins/ImageSliceFilters/ResampleImageFilter.cxx
5b2cd6cc2562e6276eed54ee089854980678ca5b
[cpPlugins.git] / plugins / ImageSliceFilters / ResampleImageFilter.cxx
1 #include <ImageSliceFilters/ResampleImageFilter.h>
2 #include <cpPlugins/DataObjects/Image.h>
3
4 #include <itkImage.h>
5 #include <itkResampleImageFilter.h>
6 #include <itkIdentityTransform.h>
7
8 // -------------------------------------------------------------------------
9 cpPluginsImageSliceFilters::ResampleImageFilter::
10 ResampleImageFilter( )
11   : Superclass( )
12 {
13   typedef cpPlugins::DataObjects::Image _TImage;
14   this->_ConfigureInput< _TImage >( "Image", true, false );
15   this->_ConfigureOutput< _TImage >( "Output" );
16
17   this->m_Parameters.ConfigureAsReal( "ReductionFactor", 1 );
18 }
19
20 // -------------------------------------------------------------------------
21 cpPluginsImageSliceFilters::ResampleImageFilter::
22 ~ResampleImageFilter( )
23 {
24 }
25
26 // -------------------------------------------------------------------------
27 void cpPluginsImageSliceFilters::ResampleImageFilter::
28 _GenerateData( )
29 {
30   auto o = this->GetInputData( "Image" );
31   cpPlugins_Demangle_Image_ScalarPixels_1( o, _GD0, 3 )
32     this->_Error( "Invalid input image." );
33 }
34
35 // -------------------------------------------------------------------------
36 template< class _TImage >
37 void cpPluginsImageSliceFilters::ResampleImageFilter::
38 _GD0( _TImage* image )
39 {
40   typedef itk::ResampleImageFilter< _TImage, _TImage > _TFilter;
41   typedef itk::IdentityTransform< double, _TImage::ImageDimension > _TTransform;
42
43   double r = this->m_Parameters.GetReal( "ReductionFactor" );
44
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 )
48     out_size[ d ] =
49       ( unsigned long )( /*std::ceil*/( double( in_size[ d ] ) * r ) );
50
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 ] ) );
55
56   typename _TImage::IndexType idx;
57   idx.Fill( 0 );
58
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( );
69   filter->Update( );
70   this->GetOutput( "Output" )->SetITK( filter->GetOutput( ) );
71 }
72
73 // eof - $RCSfile$