]> Creatis software - clitk.git/blob - tools/clitkPadImage.cxx
Merge branch 'master' of /home/dsarrut/clitk3.server
[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* pad_lower, PadBoundType* pad_upper)
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
27   typedef itk::ImageFileReader<ImageType> ImageReaderType;
28   typename ImageReaderType::Pointer reader = ImageReaderType::New();
29   reader->SetFileName(likeFile);
30   reader->Update();
31   
32   typename ImageType::Pointer like_image = reader->GetOutput();
33
34   SpacingType spacing = input->GetSpacing(), like_spacing = like_image->GetSpacing(); 
35   if (spacing != like_spacing) {
36     std::cerr << spacing << " " << like_spacing << std::endl;
37     return ERR_NOT_SAME_SPACING;
38   }
39   
40   SizeType size = input->GetLargestPossibleRegion().GetSize(), like_size = like_image->GetLargestPossibleRegion().GetSize();
41   PointType origin = input->GetOrigin(), like_origin = like_image->GetOrigin();
42   IndexType lower_bound, like_lower_bound;
43   SizeType upper_bound, like_upper_bound;
44   for (DimType i = 0; i < dim; i++) {
45     lower_bound[i] = origin[i];
46     like_lower_bound[i] = like_origin[i];
47     pad_lower[i] = (PadBoundType)(abs(like_lower_bound[i] - lower_bound[i])/spacing[i]);
48     
49     upper_bound[i] = (lower_bound[i] + size[i]*spacing[i]);
50     like_upper_bound[i] = (like_lower_bound[i] + like_size[i]*spacing[i]);
51     pad_upper[i] = (PadBoundType)((like_upper_bound[i] - upper_bound[i])/spacing[i]);
52     if (pad_upper[i] < 0)
53       pad_upper[i] = 0;
54   }
55
56    
57   return ERR_SUCCESS;
58 }
59
60 int main(int argc, char** argv)
61 {
62   const DimType dim = 3;
63   typedef short PixelType;
64   typedef itk::Image<PixelType, dim> ImageType;
65   typedef itk::ImageFileReader<ImageType> ImageReaderType;
66   typedef itk::ImageFileWriter<ImageType> ImageWriterType;
67   typedef itk::ConstantPadImageFilter<ImageType, ImageType> PadFilterType;
68   typedef typename PadFilterType::SizeValueType PadBoundType;
69   
70   GGO(clitkPadImage, args_info);
71   
72   typename ImageReaderType::Pointer reader = ImageReaderType::New();
73   reader->SetFileName(args_info.input_arg);
74   reader->Update();
75   
76   PadBoundType pad_lower[dim], pad_upper[dim];
77   typename ImageType::Pointer input = reader->GetOutput();
78   if (args_info.like_given) {
79     int err = pad_like<ImageType, PadBoundType, dim>(input, args_info.like_arg, pad_lower, pad_upper);
80     if (err) {
81       std::cerr << "Error processing like image." << std::endl;
82       return err;
83     }
84   }
85   else {
86     for (DimType i = 0; i < dim; i++) {
87       pad_lower[i] = args_info.lower_arg[i];
88       pad_upper[i] = args_info.upper_arg[i];
89     }
90   }
91   
92   typename PadFilterType::Pointer filter = PadFilterType::New();
93   filter->SetPadLowerBound(pad_lower);
94   filter->SetPadUpperBound(pad_upper);
95   filter->SetInput(input);
96   filter->SetConstant(args_info.value_arg);
97   filter->Update();
98   
99   typename ImageType::Pointer output = filter->GetOutput();
100   typename ImageWriterType::Pointer writer = ImageWriterType::New();
101   writer->SetInput(output);
102   writer->SetFileName(args_info.output_arg);
103   writer->Update();
104   
105   return ERR_SUCCESS;
106 }
107