SimpleITK  2.1.0
AdvancedImageReading/AdvancedImageReading.py
1 #!/usr/bin/env python
2 # =========================================================================
3 #
4 # Copyright NumFOCUS
5 #
6 # Licensed under the Apache License, Version 2.0 (the "License");
7 # you may not use this file except in compliance with the License.
8 # You may obtain a copy of the License at
9 #
10 # http://www.apache.org/licenses/LICENSE-2.0.txt
11 #
12 # Unless required by applicable law or agreed to in writing, software
13 # distributed under the License is distributed on an "AS IS" BASIS,
14 # WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
15 # See the License for the specific language governing permissions and
16 # limitations under the License.
17 #
18 # =========================================================================
19 
20 import sys
21 
22 import SimpleITK as sitk
23 import numpy as np
24 
25 if len(sys.argv) < 2:
26  print('Wrong number of arguments.', file=sys.stderr)
27  print('Usage: ' + __file__ + ' image_file_name', file=sys.stderr)
28  sys.exit(1)
29 
30 # Read image information without reading the bulk data.
31 file_reader = sitk.ImageFileReader()
32 file_reader.SetFileName(sys.argv[1])
33 file_reader.ReadImageInformation()
34 print(f'image size: {file_reader.GetSize()}\nimage spacing: {file_reader.GetSpacing()}')
35 # Some files have a rich meta-data dictionary (e.g. DICOM)
36 for key in file_reader.GetMetaDataKeys():
37  print(key + ': ' + file_reader.GetMetaData(key))
38 print('-' * 20)
39 
40 # When low on memory, we can incrementally work on sub-images. The following
41 # subtracts two images (ok, the same image) by reading them as multiple'
42 # sub-images.
43 
44 image1_file_name = sys.argv[1]
45 image2_file_name = sys.argv[1]
46 
47 parts = 5 # Number of sub-regions we use
48 
49 file_reader = sitk.ImageFileReader()
50 file_reader.SetFileName(image1_file_name)
51 file_reader.ReadImageInformation()
52 image_size = file_reader.GetSize()
53 
54 result_img = sitk.Image(file_reader.GetSize(), file_reader.GetPixelID(),
55  file_reader.GetNumberOfComponents())
56 result_img.SetSpacing(file_reader.GetSpacing())
57 result_img.SetOrigin(file_reader.GetOrigin())
58 result_img.SetDirection(file_reader.GetDirection())
59 
60 extract_size = list(file_reader.GetSize())
61 extract_size[-1] = extract_size[-1] // parts
62 current_index = [0] * file_reader.GetDimension()
63 for i in range(parts):
64  if i == (parts - 1):
65  extract_size[-1] = image_size[-1] - current_index[-1]
66  file_reader.SetFileName(image1_file_name)
67  file_reader.SetExtractIndex(current_index)
68  file_reader.SetExtractSize(extract_size)
69  sub_image1 = file_reader.Execute()
70 
71  file_reader.SetFileName(image2_file_name)
72  file_reader.SetExtractIndex(current_index)
73  file_reader.SetExtractSize(extract_size)
74  sub_image2 = file_reader.Execute()
75  idx = [slice(None,None)]*file_reader.GetDimension()
76  idx[-1] = current_index[-1]
77  result_img[idx] = sub_image1 - sub_image2
78  current_index[-1] += extract_size[-1]
79 del sub_image1
80 del sub_image2
81 
82 # Check that our iterative approach is equivalent to reading the whole images.
83 if np.any(sitk.GetArrayViewFromImage(result_img
84  - sitk.ReadImage(image1_file_name)
85  + sitk.ReadImage(image2_file_name))):
86  print('Subtraction error.')
87  sys.exit(1)
88 sys.exit(0)
itk::simple::Image
The Image class for SimpleITK.
Definition: sitkImage.h:75
itk::simple::ImageFileReader
Read an image file and return a SimpleITK Image.
Definition: sitkImageFileReader.h:60
itk::simple::ReadImage
SITKIO_EXPORT Image ReadImage(const std::vector< std::string > &fileNames, PixelIDValueEnum outputPixelType=sitkUnknown, const std::string &imageIO="")
ReadImage is a procedural interface to the ImageSeriesReader class which is convenient for most image...