Skip to content
Snippets Groups Projects
util.py 1.58 KiB
Newer Older
  • Learn to ignore specific revisions
  • 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