]> Creatis software - clitk.git/blobdiff - tools/clitkPadImage.cxx
Merge branch 'master' of /home/dsarrut/clitk3.server
[clitk.git] / tools / clitkPadImage.cxx
index 8b6570bfcda4a64d0453dc946fe5b92a84f797be..ad93eaa4b56e160c6ce1a58a52eb43c523d52bac 100644 (file)
@@ -5,6 +5,7 @@
 #include "clitkCommon.h"
 #include "clitkPadImage_ggo.h"
 #include <string>
+#include "itkMath.h"
 
 enum
 {
@@ -16,13 +17,14 @@ enum
 typedef unsigned int DimType;
 
 template <class ImageType, class PadBoundType, DimType dim>
-int pad_like(typename ImageType::Pointer input, const std::string& likeFile, PadBoundType* pad_lower, PadBoundType* pad_upper)
+int pad_like(typename ImageType::Pointer input, const std::string& likeFile, PadBoundType* padLower, PadBoundType* padUpper)
 {
   typedef typename ImageType::SpacingType SpacingType;
   typedef typename ImageType::RegionType RegionType;
   typedef typename ImageType::SizeType SizeType;
   typedef typename ImageType::IndexType IndexType;
   typedef typename ImageType::PointType PointType;
+  typedef typename ImageType::PointValueType PointValueType;
 
   typedef itk::ImageFileReader<ImageType> ImageReaderType;
   typename ImageReaderType::Pointer reader = ImageReaderType::New();
@@ -33,27 +35,34 @@ int pad_like(typename ImageType::Pointer input, const std::string& likeFile, Pad
 
   SpacingType spacing = input->GetSpacing(), like_spacing = like_image->GetSpacing(); 
   if (spacing != like_spacing) {
-    std::cerr << spacing << " " << like_spacing << std::endl;
+    std::cerr << "Like-image must have same spacing as input: " << spacing << " " << like_spacing << std::endl;
     return ERR_NOT_SAME_SPACING;
   }
   
   SizeType size = input->GetLargestPossibleRegion().GetSize(), like_size = like_image->GetLargestPossibleRegion().GetSize();
   PointType origin = input->GetOrigin(), like_origin = like_image->GetOrigin();
-  IndexType lower_bound, like_lower_bound;
-  SizeType upper_bound, like_upper_bound;
+  
+  PointType lower_bound, like_lower_bound;
+  PointType upper_bound, like_upper_bound;
+  PointValueType auxl = 0, auxu = 0;
   for (DimType i = 0; i < dim; i++) {
     lower_bound[i] = origin[i];
     like_lower_bound[i] = like_origin[i];
-    pad_lower[i] = (PadBoundType)(abs(like_lower_bound[i] - lower_bound[i])/spacing[i]);
+    auxl = itk::Math::Round<PointValueType>(((lower_bound[i] - like_lower_bound[i])/spacing[i]));
     
     upper_bound[i] = (lower_bound[i] + size[i]*spacing[i]);
     like_upper_bound[i] = (like_lower_bound[i] + like_size[i]*spacing[i]);
-    pad_upper[i] = (PadBoundType)((like_upper_bound[i] - upper_bound[i])/spacing[i]);
-    if (pad_upper[i] < 0)
-      pad_upper[i] = 0;
-  }
+    auxu = itk::Math::Round<PointValueType>(((like_upper_bound[i] - upper_bound[i])/spacing[i]));
+
+    if (auxl < 0 || auxu < 0) {
+      std::cerr << "Like-image's bounding box must be larger than input's" << std::endl;
+      return ERR_NOT_LIKE_LARGER;
+    }
 
-   
+    padLower[i] = (PadBoundType)auxl;
+    padUpper[i] = (PadBoundType)auxu;
+  }
+  
   return ERR_SUCCESS;
 }
 
@@ -65,16 +74,16 @@ int main(int argc, char** argv)
   typedef itk::ImageFileReader<ImageType> ImageReaderType;
   typedef itk::ImageFileWriter<ImageType> ImageWriterType;
   typedef itk::ConstantPadImageFilter<ImageType, ImageType> PadFilterType;
-  typedef typename PadFilterType::SizeValueType PadBoundType;
+  typedef PadFilterType::SizeValueType PadBoundType;
   
   GGO(clitkPadImage, args_info);
   
-  typename ImageReaderType::Pointer reader = ImageReaderType::New();
+  ImageReaderType::Pointer reader = ImageReaderType::New();
   reader->SetFileName(args_info.input_arg);
   reader->Update();
   
   PadBoundType pad_lower[dim], pad_upper[dim];
-  typename ImageType::Pointer input = reader->GetOutput();
+  ImageType::Pointer input = reader->GetOutput();
   if (args_info.like_given) {
     int err = pad_like<ImageType, PadBoundType, dim>(input, args_info.like_arg, pad_lower, pad_upper);
     if (err) {
@@ -89,15 +98,15 @@ int main(int argc, char** argv)
     }
   }
   
-  typename PadFilterType::Pointer filter = PadFilterType::New();
+  PadFilterType::Pointer filter = PadFilterType::New();
   filter->SetPadLowerBound(pad_lower);
   filter->SetPadUpperBound(pad_upper);
   filter->SetInput(input);
   filter->SetConstant(args_info.value_arg);
   filter->Update();
   
-  typename ImageType::Pointer output = filter->GetOutput();
-  typename ImageWriterType::Pointer writer = ImageWriterType::New();
+  ImageType::Pointer output = filter->GetOutput();
+  ImageWriterType::Pointer writer = ImageWriterType::New();
   writer->SetInput(output);
   writer->SetFileName(args_info.output_arg);
   writer->Update();