SimpleITK  
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()}")
35 print(f"image spacing: {file_reader.GetSpacing()}")
36 
37 # Some files have a rich meta-data dictionary (e.g. DICOM)
38 for key in file_reader.GetMetaDataKeys():
39  print(key + ": " + file_reader.GetMetaData(key))
40 print("-" * 20)
41 
42 # When low on memory, we can incrementally work on sub-images. The following
43 # subtracts two images (ok, the same image) by reading them as multiple'
44 # sub-images.
45 
46 image1_file_name = sys.argv[1]
47 image2_file_name = sys.argv[1]
48 
49 parts = 5 # Number of sub-regions we use
50 
51 file_reader = sitk.ImageFileReader()
52 file_reader.SetFileName(image1_file_name)
53 file_reader.ReadImageInformation()
54 image_size = file_reader.GetSize()
55 
56 result_img = sitk.Image(
57  file_reader.GetSize(),
58  file_reader.GetPixelID(),
59  file_reader.GetNumberOfComponents(),
60 )
61 result_img.SetSpacing(file_reader.GetSpacing())
62 result_img.SetOrigin(file_reader.GetOrigin())
63 result_img.SetDirection(file_reader.GetDirection())
64 
65 extract_size = list(file_reader.GetSize())
66 extract_size[-1] = extract_size[-1] // parts
67 current_index = [0] * file_reader.GetDimension()
68 for i in range(parts):
69  if i == (parts - 1):
70  extract_size[-1] = image_size[-1] - current_index[-1]
71  file_reader.SetFileName(image1_file_name)
72  file_reader.SetExtractIndex(current_index)
73  file_reader.SetExtractSize(extract_size)
74  sub_image1 = file_reader.Execute()
75 
76  file_reader.SetFileName(image2_file_name)
77  file_reader.SetExtractIndex(current_index)
78  file_reader.SetExtractSize(extract_size)
79  sub_image2 = file_reader.Execute()
80  idx = [slice(None, None)] * file_reader.GetDimension()
81  idx[-1] = current_index[-1]
82  result_img[idx] = sub_image1 - sub_image2
83  current_index[-1] += extract_size[-1]
84 del sub_image1
85 del sub_image2
86 
87 # Check that our iterative approach is equivalent to reading the whole images.
88 if np.any(
89  sitk.GetArrayViewFromImage(
90  result_img
91  - sitk.ReadImage(image1_file_name)
92  + sitk.ReadImage(image2_file_name)
93  )
94 ):
95  print("Subtraction error.")
96  sys.exit(1)
97 sys.exit(0)
itk::simple::Image
The Image class for SimpleITK.
Definition: sitkImage.h:76
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...