Newer
Older
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
from typing import Tuple
import numpy as np
import pydicom
"""
Since DICOM images only allow images stored in short integer format,
the Siemens scanner software multiplies values by a factor before storing
so that no precision is lost.
The scale can be found in this private DICOM tag.
"""
DCM_TAG_PIXEL_SCALE_FACTOR = 0x00331038
def load_dcm_img(filename: str) -> np.ndarray:
"""
Load a DICOM image as a numpy array and apply normalization of the Siemens SPECT/CT
Scanner.
:param filename: filename of the DICOM image
:return: the image scaled and loaded into a numpy array
"""
image = pydicom.dcmread(filename)
image = image.pixel_array / image[DCM_TAG_PIXEL_SCALE_FACTOR].value
return image
def align_images(
image_1: np.ndarray, image_2: np.ndarray
) -> Tuple[np.ndarray, np.ndarray]:
"""
Center align the image with more slices to the one with fewer slices on the first axis (z-axis).
:param image_1: the image to be aligned
:param image_2: the image to which image_1 is aligned
:return: both images aligned in the order they were put in
"""
# reverse function if image_2 has more slices
if image_2.shape[0] > image_1.shape[0]:
return align_images(image_2, image_1)[::-1]
# central slice of image 2
c_2 = image_2.shape[0] // 2
# image to the left and right of the center
left = c_2
right = image_2.shape[0] - c_2
# central slice of image 1
c_1 = image_1.shape[0] // 2
# select center and same amount to the left/right as image_2
return image_1[(c_1 - left) : (c_1 + right)], image_2