]> Creatis software - clitk.git/blob - tools/clitkPadImage.cxx
Merge commit '488f24aa984ae24adc9458bf5fbf3b2351415742'
[clitk.git] / tools / clitkPadImage.cxx
1 #include "itkImage.h"
2 #include "itkImageFileReader.h"
3 #include "itkImageFileWriter.h"
4 #include "itkConstantPadImageFilter.h"
5 #include "clitkCommon.h"
6 #include "clitkPadImage_ggo.h"
7 #include <string>
8 #include "itkMath.h"
9
10 enum
11 {
12   ERR_SUCCESS = 0,
13   ERR_NOT_SAME_SPACING = -1,
14   ERR_NOT_LIKE_LARGER = -2
15 };
16
17 typedef unsigned int DimType;
18
19 template <class ImageType, class PadBoundType, DimType dim>
20 int pad_like(typename ImageType::Pointer input, const std::string& likeFile, PadBoundType* padLower, PadBoundType* padUpper)
21 {
22   typedef typename ImageType::SpacingType SpacingType;
23   typedef typename ImageType::RegionType RegionType;
24   typedef typename ImageType::SizeType SizeType;
25   typedef typename ImageType::IndexType IndexType;
26   typedef typename ImageType::PointType PointType;
27   typedef typename ImageType::PointValueType PointValueType;
28
29   typedef itk::ImageFileReader<ImageType> ImageReaderType;
30   typename ImageReaderType::Pointer reader = ImageReaderType::New();
31   reader->SetFileName(likeFile);
32   reader->Update();
33   
34   typename ImageType::Pointer like_image = reader->GetOutput();
35
36   SpacingType spacing = input->GetSpacing(), like_spacing = like_image->GetSpacing(); 
37   if (spacing != like_spacing) {
38     std::cerr << "Like-image must have same spacing as input: " << spacing << " " << like_spacing << std::endl;
39     return ERR_NOT_SAME_SPACING;
40   }
41   
42   SizeType size = input->GetLargestPossibleRegion().GetSize(), like_size = like_image->GetLargestPossibleRegion().GetSize();
43   PointType origin = input->GetOrigin(), like_origin = like_image->GetOrigin();
44   
45   PointType lower_bound, like_lower_bound;
46   PointType upper_bound, like_upper_bound;
47   PointValueType auxl = 0, auxu = 0;
48   for (DimType i = 0; i < dim; i++) {
49     lower_bound[i] = origin[i];
50     like_lower_bound[i] = like_origin[i];
51     auxl = itk::Math::Round<PointValueType>(((lower_bound[i] - like_lower_bound[i])/spacing[i]));
52     
53     upper_bound[i] = (lower_bound[i] + size[i]*spacing[i]);
54     like_upper_bound[i] = (like_lower_bound[i] + like_size[i]*spacing[i]);
55     auxu = itk::Math::Round<PointValueType>(((like_upper_bound[i] - upper_bound[i])/spacing[i]));
56
57     if (auxl < 0 || auxu < 0) {
58       std::cerr << "Like-image's bounding box must be larger than input's" << std::endl;
59       return ERR_NOT_LIKE_LARGER;
60     }
61
62     padLower[i] = (PadBoundType)auxl;
63     padUpper[i] = (PadBoundType)auxu;
64   }
65   
66   return ERR_SUCCESS;
67 }
68
69 int main(int argc, char** argv)
70 {
71   const DimType dim = 3;
72   typedef short PixelType;
73   typedef itk::Image<PixelType, dim> ImageType;
74   typedef itk::ImageFileReader<ImageType> ImageReaderType;
75   typedef itk::ImageFileWriter<ImageType> ImageWriterType;
76   typedef itk::ConstantPadImageFilter<ImageType, ImageType> PadFilterType;
77   typedef PadFilterType::SizeValueType PadBoundType;
78   
79   GGO(clitkPadImage, args_info);
80   
81   ImageReaderType::Pointer reader = ImageReaderType::New();
82   reader->SetFileName(args_info.input_arg);
83   reader->Update();
84   
85   PadBoundType pad_lower[dim], pad_upper[dim];
86   ImageType::Pointer input = reader->GetOutput();
87   if (args_info.like_given) {
88     int err = pad_like<ImageType, PadBoundType, dim>(input, args_info.like_arg, pad_lower, pad_upper);
89     if (err) {
90       std::cerr << "Error processing like image." << std::endl;
91       return err;
92     }
93   }
94   else {
95     for (DimType i = 0; i < dim; i++) {
96       pad_lower[i] = args_info.lower_arg[i];
97       pad_upper[i] = args_info.upper_arg[i];
98     }
99   }
100   
101   PadFilterType::Pointer filter = PadFilterType::New();
102   filter->SetPadLowerBound(pad_lower);
103   filter->SetPadUpperBound(pad_upper);
104   filter->SetInput(input);
105   filter->SetConstant(args_info.value_arg);
106   filter->Update();
107   
108   ImageType::Pointer output = filter->GetOutput();
109   ImageWriterType::Pointer writer = ImageWriterType::New();
110   writer->SetInput(output);
111   writer->SetFileName(args_info.output_arg);
112   writer->Update();
113   
114   return ERR_SUCCESS;
115 }
116