2 #include "itkImageFileReader.h"
3 #include "itkImageFileWriter.h"
4 #include "itkConstantPadImageFilter.h"
5 #include "clitkCommon.h"
6 #include "clitkPadImage_ggo.h"
13 ERR_NOT_SAME_SPACING = -1,
14 ERR_NOT_LIKE_LARGER = -2
17 typedef unsigned int DimType;
19 template <class ImageType, class PadBoundType, DimType dim>
20 int pad_like(typename ImageType::Pointer input, const std::string& likeFile, PadBoundType* padLower, PadBoundType* padUpper)
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;
29 typedef itk::ImageFileReader<ImageType> ImageReaderType;
30 typename ImageReaderType::Pointer reader = ImageReaderType::New();
31 reader->SetFileName(likeFile);
34 typename ImageType::Pointer like_image = reader->GetOutput();
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;
42 SizeType size = input->GetLargestPossibleRegion().GetSize(), like_size = like_image->GetLargestPossibleRegion().GetSize();
43 PointType origin = input->GetOrigin(), like_origin = like_image->GetOrigin();
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]));
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]));
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;
62 padLower[i] = (PadBoundType)auxl;
63 padUpper[i] = (PadBoundType)auxu;
69 int main(int argc, char** argv)
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;
79 GGO(clitkPadImage, args_info);
81 ImageReaderType::Pointer reader = ImageReaderType::New();
82 reader->SetFileName(args_info.input_arg);
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);
90 std::cerr << "Error processing like image." << std::endl;
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];
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);
108 ImageType::Pointer output = filter->GetOutput();
109 ImageWriterType::Pointer writer = ImageWriterType::New();
110 writer->SetInput(output);
111 writer->SetFileName(args_info.output_arg);