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