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""" An SimpleITK example demonstrating advanced image reading techniques. """
21
22import sys
23
24import SimpleITK as sitk
25import numpy as np
26
27if len(sys.argv) < 2:
28 print("Wrong number of arguments.", file=sys.stderr)
29 print("Usage: " + __file__ + " image_file_name", file=sys.stderr)
30 sys.exit(1)
31
32# Read image information without reading the bulk data.
33file_reader = sitk.ImageFileReader()
34file_reader.SetFileName(sys.argv[1])
35file_reader.ReadImageInformation()
36print(f"image size: {file_reader.GetSize()}")
37print(f"image spacing: {file_reader.GetSpacing()}")
38
39# Some files have a rich meta-data dictionary (e.g. DICOM)
40for key in file_reader.GetMetaDataKeys():
41 print(key + ": " + file_reader.GetMetaData(key))
42print("-" * 20)
43
44# When low on memory, we can incrementally work on sub-images. The following
45# subtracts two images (ok, the same image) by reading them as multiple'
46# sub-images.
47
48image1_file_name = sys.argv[1]
49image2_file_name = sys.argv[1]
50
51parts = 5 # Number of sub-regions we use
52
53file_reader = sitk.ImageFileReader()
54file_reader.SetFileName(image1_file_name)
55file_reader.ReadImageInformation()
56image_size = file_reader.GetSize()
57
58result_img = sitk.Image(
59 file_reader.GetSize(),
60 file_reader.GetPixelID(),
61 file_reader.GetNumberOfComponents(),
62)
63result_img.SetSpacing(file_reader.GetSpacing())
64result_img.SetOrigin(file_reader.GetOrigin())
65result_img.SetDirection(file_reader.GetDirection())
66
67extract_size = list(file_reader.GetSize())
68extract_size[-1] = extract_size[-1] // parts
69current_index = [0] * file_reader.GetDimension()
70for i in range(parts):
71 if i == (parts - 1):
72 extract_size[-1] = image_size[-1] - current_index[-1]
73 file_reader.SetFileName(image1_file_name)
74 file_reader.SetExtractIndex(current_index)
75 file_reader.SetExtractSize(extract_size)
76 sub_image1 = file_reader.Execute()
77
78 file_reader.SetFileName(image2_file_name)
79 file_reader.SetExtractIndex(current_index)
80 file_reader.SetExtractSize(extract_size)
81 sub_image2 = file_reader.Execute()
82 idx = [slice(None, None)] * file_reader.GetDimension()
83 idx[-1] = current_index[-1]
84 result_img[idx] = sub_image1 - sub_image2
85 current_index[-1] += extract_size[-1]
86del sub_image1
87del sub_image2
88
89# Check that our iterative approach is equivalent to reading the whole images.
90if np.any(
91 sitk.GetArrayViewFromImage(
92 result_img - sitk.ReadImage(image1_file_name) + sitk.ReadImage(image2_file_name)
93 )
94):
95 print("Subtraction error.")
96 sys.exit(1)
97sys.exit(0)
Read an image file and return a SimpleITK Image.
The Image class for SimpleITK.
Definition sitkImage.h:77
SITKIO_EXPORT Image ReadImage(const PathType &filename, PixelIDValueEnum outputPixelType=sitkUnknown, const std::string &imageIO="")
ReadImage is a procedural interface to the ImageFileReader class which is convenient for most image r...