--- /dev/null
+#ifdef _USE_ITK_
+
+#include <math.h>
+#include "bbtkUserBlackBox.h"
+#include "itkResampleImageFilter.h"
+#include "bbitkImage.h"
+#include "itkNearestNeighborInterpolateImageFunction.h"
+#include "itkLinearInterpolateImageFunction.h"
+#include "itkBSplineInterpolateImageFunction.h"
+
+namespace bbitk
+{
+
+
+ class /*BBTK_EXPORT*/ ResampleImageFilter
+ :
+ public bbtk::UserBlackBox
+ {
+ BBTK_USER_BLACK_BOX_INTERFACE(ResampleImageFilter,
+ bbtk::UserBlackBox);
+ BBTK_DECLARE_INPUT(In,anyImagePointer);
+ BBTK_DECLARE_INPUT(Spacing,std::vector<double>);
+ BBTK_DECLARE_INPUT(Interpolation,std::string);
+ BBTK_DECLARE_OUTPUT(Out,anyImagePointer);
+ BBTK_PROCESS(ProcessSwitch);
+ private :
+ inline void ProcessSwitch();
+ template <class T> void Process();
+ void bbUserConstructor() { Init(); }
+ void bbUserCopyConstructor() { Init(); }
+ void Init();
+ itk::Object* mOutput;
+ };
+
+ BBTK_BEGIN_DESCRIBE_BLACK_BOX(ResampleImageFilter,
+ bbtk::UserBlackBox);
+ BBTK_NAME("ResampleImageFilter");
+ BBTK_AUTHOR("laurent.guigues@creatis.insa-lyon.fr");
+ BBTK_DESCRIPTION("Resamples an image");
+ BBTK_INPUT(ResampleImageFilter,In,
+ "Input image. Can be any itk::Image<T,D>*",anyImagePointer);
+ BBTK_INPUT(ResampleImageFilter,Spacing,
+ "Spacing",std::vector<double>);
+ BBTK_INPUT(ResampleImageFilter,Interpolation,
+ "Interpolation",std::string);
+ BBTK_OUTPUT(ResampleImageFilter,Out,
+ "Output image. Of the same type and dimension than the input image",
+ anyImagePointer);
+ BBTK_END_DESCRIBE_BLACK_BOX(ResampleImageFilter);
+
+
+
+ void ResampleImageFilter::ProcessSwitch()
+ {
+ bbtk::TypeInfo t = bbGetInputIn().type();
+ BBTK_TEMPLATE_ITK_IMAGE_SWITCH(t, this->Process);
+ }
+
+ template <class T>
+ void ResampleImageFilter::Process()
+ {
+ bbtkDebugMessageInc("Core",9,
+ "bbitk::ResampleImageFilter::Process<"
+ <<bbtk::TypeName<T>()<<">()"<<std::endl);
+
+ typedef T ImageType;
+ typedef itk::ResampleImageFilter<ImageType,ImageType> FilterType;
+ typename FilterType::Pointer filter = FilterType::New();
+ const unsigned int Dimension = ImageType::ImageDimension;
+
+ // Input
+ T* in = this->bbGetInputIn().get<T*>();
+ filter->SetInput( in );
+
+ // Size, Spacing, Origin and DefaultPixelVal
+ typename ImageType::SizeType size;
+ typename ImageType::SpacingType spacing;
+ typename ImageType::PointType origin;
+ typename ImageType::RegionType LPR;
+ LPR = in->GetLargestPossibleRegion();
+ size = LPR.GetSize();
+ // origin = LPR.GetIndex(); //in->GetOrigin();
+ for (int i=0;i<Dimension;++i)
+ {
+ origin[i] = LPR.GetIndex()[i]*in->GetSpacing()[i];
+ spacing[i] = bbGetInputSpacing()[i];
+ double tmp = (LPR.GetSize()[i]*in->GetSpacing()[i]/spacing[i] ) + 0.5;
+ size[i] = (long)floor(tmp);
+// size[i] = (long)lrint(LPR.GetSize()[i]*in->GetSpacing()[i]/spacing[i]);
+ }
+
+ filter->SetOutputOrigin (origin);
+ filter->SetSize (size);
+ filter->SetOutputSpacing( spacing );
+
+ filter->SetDefaultPixelValue (0);
+ filter->SetOutputDirection( in->GetDirection() );
+
+
+
+ // Transform
+ typedef itk::AffineTransform < double, Dimension> TransformType;
+
+ // Instance of the transform object to be passed to the resample filter
+ // By default, identity transform is applied
+ typename TransformType::Pointer transform = TransformType::New();
+ filter->SetTransform ( transform );
+
+
+ // Interpolation
+ if ( bbGetInputInterpolation() == "Linear" ) {
+ typedef itk::LinearInterpolateImageFunction < ImageType, double > InterpolatorType;
+ // We create an interpolator of the found type
+ typename InterpolatorType::Pointer interpolator = InterpolatorType::New();
+ filter->SetInterpolator( interpolator );
+ }
+ else if ( bbGetInputInterpolation() == "NearestNeighbor" ) {
+ typedef itk::NearestNeighborInterpolateImageFunction < ImageType, double > InterpolatorType;
+ // We create an interpolator of the found type
+ typename InterpolatorType::Pointer interpolator = InterpolatorType::New();
+ filter->SetInterpolator( interpolator );
+ }
+ else if ( bbGetInputInterpolation() == "BSpline") {
+ typedef itk::BSplineInterpolateImageFunction < ImageType, double > InterpolatorType;
+ // We create an interpolator of the found type
+ typename InterpolatorType::Pointer interpolator = InterpolatorType::New();
+ filter->SetInterpolator(interpolator);
+ // When handling unsigned data, it is possible that the interpolated value is negative
+ // if ( (m_InputImage->GetComponentTypeAsString() == "uchar") ||
+ // (m_InputImage->GetComponentTypeAsString() == "ushort") ||
+ // (m_InputImage->GetComponentTypeAsString() == "uint") ) {
+ // std::cout << "Warning! you're using unsigned data ! The interpolated value may result negative! "<< std::endl;
+ // }
+ } //end else if
+
+
+ filter->Update();
+ filter->GetOutput()->Register();
+ if (mOutput) mOutput->UnRegister();
+ this->bbSetOutputOut( filter->GetOutput() );
+ mOutput = filter->GetOutput();
+
+ bbtkDebugDecTab("Core",9);
+ }
+
+
+ void ResampleImageFilter::Init()
+ {
+ std::vector<double> res;
+ res.push_back(1);
+ res.push_back(1);
+ res.push_back(1);
+ bbSetInputSpacing(res);
+ mOutput = 0;
+ }
+
+}
+// EO namespace bbtk
+
+#endif