2 #include "itkImageFileReader.h"
3 #include "itkImageFileWriter.h"
4 #include "itkConstantPadImageFilter.h"
5 #include "clitkCommon.h"
6 #include "clitkPadImage_ggo.h"
12 ERR_NOT_SAME_SPACING = -1,
13 ERR_NOT_LIKE_LARGER = -2
16 typedef unsigned int DimType;
18 template <class ImageType, class PadBoundType, DimType dim>
19 int pad_like(typename ImageType::Pointer input, const std::string& likeFile, PadBoundType* padLower, PadBoundType* padUpper)
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;
28 typedef itk::ImageFileReader<ImageType> ImageReaderType;
29 typename ImageReaderType::Pointer reader = ImageReaderType::New();
30 reader->SetFileName(likeFile);
33 typename ImageType::Pointer like_image = reader->GetOutput();
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;
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]));
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]));
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;
60 padLower[i] = (PadBoundType)auxl;
61 padUpper[i] = (PadBoundType)auxu;
67 int main(int argc, char** argv)
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;
77 GGO(clitkPadImage, args_info);
79 typename ImageReaderType::Pointer reader = ImageReaderType::New();
80 reader->SetFileName(args_info.input_arg);
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);
88 std::cerr << "Error processing like image." << std::endl;
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];
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);
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);