]> Creatis software - bbtk.git/blobdiff - packages/itk/src/bbitkResampleImageFilter.h
*** empty log message ***
[bbtk.git] / packages / itk / src / bbitkResampleImageFilter.h
diff --git a/packages/itk/src/bbitkResampleImageFilter.h b/packages/itk/src/bbitkResampleImageFilter.h
new file mode 100644 (file)
index 0000000..a46bf4c
--- /dev/null
@@ -0,0 +1,160 @@
+#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