]> Creatis software - clitk.git/blobdiff - itk/clitkResampleImageWithOptionsFilter.txx
commented affinetransf header
[clitk.git] / itk / clitkResampleImageWithOptionsFilter.txx
index dd5a82142edbc0d808a46d5ab713d8d96062e7f8..beb85cc28adc45b01e48382c111281ef1ed0fe8c 100644 (file)
 #include "itkResampleImageFilter.h"
 #include "itkAffineTransform.h"
 #include "itkNearestNeighborInterpolateImageFunction.h"
+#include "itkWindowedSincInterpolateImageFunction.h"
 #include "itkLinearInterpolateImageFunction.h"
 #include "itkBSplineInterpolateImageFunction.h"
 #include "itkBSplineInterpolateImageFunctionWithLUT.h"
 #include "itkCommand.h"
 
-namespace clitk
-{
-
 //--------------------------------------------------------------------
-template <class TInputImage, class TOutputImage>
-ResampleImageWithOptionsFilter<TInputImage, TOutputImage>::
-ResampleImageWithOptionsFilter():itk::ImageToImageFilter<TInputImage, TOutputImage>()
+template <class InputImageType, class OutputImageType>
+clitk::ResampleImageWithOptionsFilter<InputImageType, OutputImageType>::
+ResampleImageWithOptionsFilter():itk::ImageToImageFilter<InputImageType, OutputImageType>() 
 {
   static const unsigned int dim = InputImageType::ImageDimension;
   this->SetNumberOfRequiredInputs(1);
@@ -62,10 +60,10 @@ ResampleImageWithOptionsFilter():itk::ImageToImageFilter<TInputImage, TOutputIma
 
 
 //--------------------------------------------------------------------
-template <class TInputImage, class TOutputImage>
+template <class InputImageType, class OutputImageType>
 void
-ResampleImageWithOptionsFilter<TInputImage, TOutputImage>::
-SetInput(const InputImageType * image)
+clitk::ResampleImageWithOptionsFilter<InputImageType, OutputImageType>::
+SetInput(const InputImageType * image) 
 {
   // Process object is not const-correct so the const casting is required.
   this->SetNthInput(0, const_cast<InputImageType *>(image));
@@ -74,17 +72,17 @@ SetInput(const InputImageType * image)
 
 
 //--------------------------------------------------------------------
-template <class TInputImage, class TOutputImage>
+template <class InputImageType, class OutputImageType>
 void
-ResampleImageWithOptionsFilter<TInputImage, TOutputImage>::
-GenerateInputRequestedRegion()
+clitk::ResampleImageWithOptionsFilter<InputImageType, OutputImageType>::
+GenerateInputRequestedRegion() 
 {
   // call the superclass's implementation of this method
   Superclass::GenerateInputRequestedRegion();
 
   // get pointers to the input and output
   InputImagePointer  inputPtr  =
-    const_cast< TInputImage *>( this->GetInput() );
+    const_cast< InputImageType *>( this->GetInput() );
 
   // Request the entire input image
   InputImageRegionType inputRegion;
@@ -95,10 +93,10 @@ GenerateInputRequestedRegion()
 
 
 //--------------------------------------------------------------------
-template <class TInputImage, class TOutputImage>
+template <class InputImageType, class OutputImageType>
 void
-ResampleImageWithOptionsFilter<TInputImage, TOutputImage>::
-GenerateOutputInformation()
+clitk::ResampleImageWithOptionsFilter<InputImageType, OutputImageType>::
+GenerateOutputInformation() 
 {
   static const unsigned int dim = InputImageType::ImageDimension;
 
@@ -148,25 +146,27 @@ GenerateOutputInformation()
     m_OutputSize[l] = inputSize[l];
     m_OutputSpacing[l] = inputSpacing[l];
   }
-
+    
   // Set Size/Spacing
   OutputImagePointer outputImage = this->GetOutput(0);
-  OutputImageRegionType region;
-  region.SetSize(m_OutputSize);
-  region.SetIndex(input->GetLargestPossibleRegion().GetIndex());
-  DD(input->GetLargestPossibleRegion().GetIndex());
-  outputImage->SetLargestPossibleRegion(region);
+  // OutputImageRegionType region;
+  m_OutputRegion.SetSize(m_OutputSize);
+  m_OutputRegion.SetIndex(input->GetLargestPossibleRegion().GetIndex());
+  outputImage->CopyInformation(input);
+  outputImage->SetLargestPossibleRegion(m_OutputRegion);
   outputImage->SetSpacing(m_OutputSpacing);
 
   // Init Gaussian sigma
   if (m_GaussianSigma[0] != -1) { // Gaussian filter set by user
     m_GaussianFilteringEnabled = true;
-  } else {
+  }
+  else {
     if (m_GaussianFilteringEnabled) { // Automated sigma when downsample
       for(unsigned int i=0; i<dim; i++) {
         if (m_OutputSpacing[i] > inputSpacing[i]) { // downsample
           m_GaussianSigma[i] = 0.5*m_OutputSpacing[i];// / inputSpacing[i]);
-        } else m_GaussianSigma[i] = 0; // will be ignore after
+        }
+        else m_GaussianSigma[i] = 0; // will be ignore after
       }
     }
   }
@@ -178,23 +178,28 @@ GenerateOutputInformation()
 
 
 //--------------------------------------------------------------------
-template <class TInputImage, class TOutputImage>
-void
-ResampleImageWithOptionsFilter<TInputImage, TOutputImage>::
-GenerateData()
+template <class InputImageType, class OutputImageType>
+void 
+clitk::ResampleImageWithOptionsFilter<InputImageType, OutputImageType>::
+GenerateData() 
 {
-
+   
   // Get input pointer
   InputImagePointer input = dynamic_cast<InputImageType*>(itk::ProcessObject::GetInput(0));
   static const unsigned int dim = InputImageType::ImageDimension;
 
+  // Set regions and allocate
+  //this->GetOutput()->SetRegions(m_OutputRegion);
+  //this->GetOutput()->Allocate();
+  // this->GetOutput()->FillBuffer(m_DefaultPixelValue);
+
   // Create main Resample Image Filter
   typedef itk::ResampleImageFilter<InputImageType,OutputImageType> FilterType;
   typename FilterType::Pointer filter = FilterType::New();
   filter->GraftOutput(this->GetOutput());
-//     this->GetOutput()->Print(std::cout);
-//     this->GetOutput()->SetBufferedRegion(this->GetOutput()->GetLargestPossibleRegion());
-//     this->GetOutput()->Print(std::cout);
+  //     this->GetOutput()->Print(std::cout);
+  //     this->GetOutput()->SetBufferedRegion(this->GetOutput()->GetLargestPossibleRegion());
+  //     this->GetOutput()->Print(std::cout);
 
   // Print options if needed
   if (m_VerboseOptions) {
@@ -205,18 +210,11 @@ GenerateData()
       std::cout << "Sigma          = " << m_GaussianSigma << std::endl;
     std::cout << "Interpol       = ";
     switch (m_InterpolationType) {
-    case NearestNeighbor:
-      std::cout << "NearestNeighbor" << std::endl;
-      break;
-    case Linear:
-      std::cout << "Linear" << std::endl;
-      break;
-    case BSpline:
-      std::cout << "BSpline " << m_BSplineOrder << std::endl;
-      break;
-    case B_LUT:
-      std::cout << "B-LUT " << m_BSplineOrder << " " << m_BLUTSamplingFactor << std::endl;
-      break;
+    case NearestNeighbor: std::cout << "NearestNeighbor" << std::endl; break;
+    case Linear: std::cout << "Linear" << std::endl; break;
+    case BSpline: std::cout << "BSpline " << m_BSplineOrder << std::endl; break;
+    case B_LUT: std::cout << "B-LUT " << m_BSplineOrder << " " << m_BLUTSamplingFactor << std::endl; break;
+    case WSINC: std::cout << "Windowed Sinc" << std::endl; break;
     }
     std::cout << "Threads        = " << this->GetNumberOfThreads() << std::endl;
     std::cout << "LastDimIsTime  = " << m_LastDimensionIsTime << std::endl;
@@ -229,7 +227,8 @@ GenerateData()
   filter->SetOutputSpacing(m_OutputSpacing);
   filter->SetOutputOrigin(input->GetOrigin());
   filter->SetDefaultPixelValue(m_DefaultPixelValue);
-  filter->SetNumberOfThreads(this->GetNumberOfThreads());
+  filter->SetNumberOfThreads(this->GetNumberOfThreads()); 
+  filter->SetOutputDirection(input->GetDirection()); // <-- NEEDED if we want to keep orientation (in case of PermutAxes for example)
 
   // Select interpolator
   switch (m_InterpolationType) {
@@ -260,9 +259,16 @@ GenerateData()
     filter->SetInterpolator(interpolator);
     break;
   }
+  case WSINC: {
+    typedef itk::WindowedSincInterpolateImageFunction<InputImageType, 4> InterpolatorType;
+    typename InterpolatorType::Pointer interpolator =  InterpolatorType::New();
+    filter->SetInterpolator(interpolator);
+    break;
+  }
   }
 
   // Initial Gaussian blurring if needed
+  // TODO : replace by itk::DiscreteGaussianImageFilter for small sigma
   typedef itk::RecursiveGaussianImageFilter<InputImageType, InputImageType> GaussianFilterType;
   std::vector<typename GaussianFilterType::Pointer> gaussianFilters;
   if (m_GaussianFilteringEnabled) {
@@ -290,10 +296,37 @@ GenerateData()
 
   // Set output
   // DD("before Graft");
-  this->GraftOutput(filter->GetOutput());
+
+  //this->GraftOutput(filter->GetOutput());
+  this->SetNthOutput(0, filter->GetOutput());
+
   // DD("after Graft");
 }
 //--------------------------------------------------------------------
 
-}//end clitk
 
+//--------------------------------------------------------------------
+template<class InputImageType>
+typename InputImageType::Pointer 
+clitk::ResampleImageSpacing(typename InputImageType::Pointer input, 
+                            typename InputImageType::SpacingType spacing, 
+                            int interpolationType)
+{
+  typedef clitk::ResampleImageWithOptionsFilter<InputImageType> ResampleFilterType;
+  typename ResampleFilterType::Pointer resampler = ResampleFilterType::New();
+  resampler->SetInput(input);
+  resampler->SetOutputSpacing(spacing);
+  typename ResampleFilterType::InterpolationTypeEnumeration inter=ResampleFilterType::NearestNeighbor;
+  switch(interpolationType) {
+  case 0: inter = ResampleFilterType::NearestNeighbor; break;
+  case 1: inter = ResampleFilterType::Linear; break;
+  case 2: inter = ResampleFilterType::BSpline; break;
+  case 3: inter = ResampleFilterType::B_LUT; break;
+  case 4: inter = ResampleFilterType::WSINC; break;
+  }
+  resampler->SetInterpolationType(inter);
+  resampler->SetGaussianFilteringEnabled(true);
+  resampler->Update();
+  return resampler->GetOutput();
+}
+//--------------------------------------------------------------------