]> Creatis software - clitk.git/blob - tools/clitkPadImage.cxx
fine tuning clitkPadImage
[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   
44   PointType lower_bound, like_lower_bound;
45   PointType upper_bound, like_upper_bound;
46   PointValueType auxl = 0, auxu = 0;
47   for (DimType i = 0; i < dim; i++) {
48     lower_bound[i] = origin[i];
49     like_lower_bound[i] = like_origin[i];
50     auxl = round(((lower_bound[i] - like_lower_bound[i])/spacing[i]));
51     
52     upper_bound[i] = (lower_bound[i] + size[i]*spacing[i]);
53     like_upper_bound[i] = (like_lower_bound[i] + like_size[i]*spacing[i]);
54     auxu = round(((like_upper_bound[i] - upper_bound[i])/spacing[i]));
55
56     if (auxl < 0 || auxu < 0) {
57       std::cerr << "Like-image's bounding box must be larger than input's" << std::endl;
58       return ERR_NOT_LIKE_LARGER;
59     }
60
61     padLower[i] = (PadBoundType)auxl;
62     padUpper[i] = (PadBoundType)auxu;
63   }
64   
65   return ERR_SUCCESS;
66 }
67
68 int main(int argc, char** argv)
69 {
70   const DimType dim = 3;
71   typedef short PixelType;
72   typedef itk::Image<PixelType, dim> ImageType;
73   typedef itk::ImageFileReader<ImageType> ImageReaderType;
74   typedef itk::ImageFileWriter<ImageType> ImageWriterType;
75   typedef itk::ConstantPadImageFilter<ImageType, ImageType> PadFilterType;
76   typedef typename PadFilterType::SizeValueType PadBoundType;
77   
78   GGO(clitkPadImage, args_info);
79   
80   typename ImageReaderType::Pointer reader = ImageReaderType::New();
81   reader->SetFileName(args_info.input_arg);
82   reader->Update();
83   
84   PadBoundType pad_lower[dim], pad_upper[dim];
85   typename ImageType::Pointer input = reader->GetOutput();
86   if (args_info.like_given) {
87     int err = pad_like<ImageType, PadBoundType, dim>(input, args_info.like_arg, pad_lower, pad_upper);
88     if (err) {
89       std::cerr << "Error processing like image." << std::endl;
90       return err;
91     }
92   }
93   else {
94     for (DimType i = 0; i < dim; i++) {
95       pad_lower[i] = args_info.lower_arg[i];
96       pad_upper[i] = args_info.upper_arg[i];
97     }
98   }
99   
100   typename PadFilterType::Pointer filter = PadFilterType::New();
101   filter->SetPadLowerBound(pad_lower);
102   filter->SetPadUpperBound(pad_upper);
103   filter->SetInput(input);
104   filter->SetConstant(args_info.value_arg);
105   filter->Update();
106   
107   typename ImageType::Pointer output = filter->GetOutput();
108   typename ImageWriterType::Pointer writer = ImageWriterType::New();
109   writer->SetInput(output);
110   writer->SetFileName(args_info.output_arg);
111   writer->Update();
112   
113   return ERR_SUCCESS;
114 }
115