@@ -43,49 +43,69 @@ main(int argc, char * argv[])
43
43
using PixelType = unsigned char ;
44
44
using ImageType = itk::Image<PixelType, Dimension>;
45
45
using ScalarType = double ;
46
+ using IndexValueType = typename itk::Index<Dimension>::IndexValueType;
46
47
47
48
using ReaderType = itk::ImageFileReader<ImageType>;
48
- ReaderType::Pointer reader = ReaderType::New ();
49
+ typename ReaderType::Pointer reader = ReaderType::New ();
49
50
reader->SetFileName (inputFileName);
50
51
reader->Update ();
51
52
52
- ImageType::Pointer inputImage = reader->GetOutput ();
53
-
54
- ImageType::RegionType region = inputImage->GetLargestPossibleRegion ();
55
- ImageType::SizeType size = region.GetSize ();
56
- ImageType::SpacingType spacing = inputImage->GetSpacing ();
57
-
58
- itk::Index<Dimension> centralPixel;
59
- centralPixel[0 ] = size[0 ] / 2 ;
60
- centralPixel[1 ] = size[1 ] / 2 ;
61
- itk::Point<ScalarType, Dimension> centralPoint;
62
- centralPoint[0 ] = centralPixel[0 ];
63
- centralPoint[1 ] = centralPixel[1 ];
53
+ const typename ImageType::Pointer inputImage = reader->GetOutput ();
54
+ const typename ImageType::RegionType inputRegion = inputImage->GetLargestPossibleRegion ();
55
+ const typename ImageType::SizeType inputSize = inputRegion.GetSize ();
56
+ const typename ImageType::SpacingType inputSpacing = inputImage->GetSpacing ();
57
+ const typename ImageType::PointType inputOrigin = inputImage->GetOrigin ();
58
+
59
+ /*
60
+ * We will scale the objects in the image by the factor `scale`; that is they
61
+ * will be shrunk (scale < 1.0) or enlarged (scale > 1.0). However, the
62
+ * number of pixels for each dimension of the output image will equal the
63
+ * corresponding number of pixels in the input image, with padding (if
64
+ * shrunk) or cropping (if enlarged) as necessary. Furthermore, the physical
65
+ * distance between adjacent pixels will be the same in the input and the
66
+ * output images. In contrast, if you want to change the resolution of the
67
+ * image without changing the represented physical size of the objects in the
68
+ * image, omit the transform and instead use:
69
+ *
70
+ * outputSize[d] = inputSize[d] * scale;
71
+ * outputSpacing[d] = inputSpacing[d] / scale;
72
+ * outputOrigin[d] = inputOrigin[d] + 0.5 * (outputSpacing[d] - inputSpacing[d]);
73
+ *
74
+ * in the loop over dimensions.
75
+ */
76
+
77
+ typename ImageType::SizeType outputSize = inputSize;
78
+ typename ImageType::SpacingType outputSpacing = inputSpacing;
79
+ typename ImageType::PointType outputOrigin = inputOrigin;
64
80
65
81
using ScaleTransformType = itk::ScaleTransform<ScalarType, Dimension>;
66
- ScaleTransformType::Pointer scaleTransform = ScaleTransformType::New ();
67
-
68
- ScaleTransformType::ParametersType parameters = scaleTransform->GetParameters ();
69
- parameters[0 ] = scale;
70
- parameters[1 ] = scale;
82
+ typename ScaleTransformType::Pointer scaleTransform = ScaleTransformType::New ();
71
83
72
- scaleTransform->SetParameters (parameters);
73
- scaleTransform->SetCenter (centralPoint);
84
+ typename ScaleTransformType::ParametersType scaleTransformParameters = scaleTransform->GetParameters ();
85
+ itk::Point<ScalarType, Dimension> scaleTransformCenter;
86
+ for (unsigned int d = 0 ; d < Dimension; ++d)
87
+ {
88
+ scaleTransformParameters[d] = scale;
89
+ scaleTransformCenter[d] = static_cast <ScalarType>(static_cast <IndexValueType>(inputSize[d] / 2 ));
90
+ }
91
+ scaleTransform->SetParameters (scaleTransformParameters);
92
+ scaleTransform->SetCenter (scaleTransformCenter);
74
93
75
94
using LinearInterpolatorType = itk::LinearInterpolateImageFunction<ImageType, ScalarType>;
76
- LinearInterpolatorType::Pointer interpolator = LinearInterpolatorType::New ();
95
+ typename LinearInterpolatorType::Pointer interpolator = LinearInterpolatorType::New ();
77
96
78
97
using ResampleFilterType = itk::ResampleImageFilter<ImageType, ImageType>;
79
- ResampleFilterType::Pointer resampleFilter = ResampleFilterType::New ();
98
+ typename ResampleFilterType::Pointer resampleFilter = ResampleFilterType::New ();
80
99
81
100
resampleFilter->SetInput (inputImage);
82
101
resampleFilter->SetTransform (scaleTransform);
83
102
resampleFilter->SetInterpolator (interpolator);
84
- resampleFilter->SetSize (size);
85
- resampleFilter->SetOutputSpacing (spacing);
103
+ resampleFilter->SetSize (outputSize);
104
+ resampleFilter->SetOutputSpacing (outputSpacing);
105
+ resampleFilter->SetOutputOrigin (outputOrigin);
86
106
87
107
using WriterType = itk::ImageFileWriter<ImageType>;
88
- WriterType::Pointer writer = WriterType::New ();
108
+ typename WriterType::Pointer writer = WriterType::New ();
89
109
writer->SetFileName (outputFileName);
90
110
writer->SetInput (resampleFilter->GetOutput ());
91
111
0 commit comments