Source code for toor.ImageReader.DICOM.filesreader
import os
import numpy as np
import vtk
import pydicom
from pydicom import dcmread
from pydicom.fileset import FileSet
from pydicom.filereader import read_dicomdir
from pydicom.uid import generate_uid
from pydicom import config
import os
from pathlib import Path
import matplotlib.pyplot as plt
import tkinter as tk
from tkinter import filedialog
from os import listdir, path
[docs]
def fix_sop_class(elem, **kwargs):
if elem.tag == 0x00020002:
# DigitalXRayImageStorageForProcessing
elem = elem._replace(value=b"1.2.840.10008.5.1.4.1.1.1.1.1")
return elem
[docs]
class DicomVTKReader():
def __init__(self):
base_name = os.path.dirname(os.path.abspath(__file__))
name_file = os.path.join(base_name, 'DICOM_test_files', 'S97210','S30','I10.DCM')
# name_file = 'C:\\Users\\pedro\\OneDrive - Universidade de Aveiro\\PhD\\Simulations\\SimulationIPET\\IPET_DerenzoSmall_500uCi_Na22_ListMode\\whole_body\\29\\IMG108_0_series20.dcm'
name_file = 'C:\\Users\\pedro\\Universidade de Aveiro\\Fabiana Ribeiro - iCBR\\iCBR_Acquisitions\\2022\\2022-07_V64\\Easypet Scan 27 Jul 2022 - 15h 49m 04s\\whole_body\\1\\IM0_f0_s1ID_Animal 74[18F]-FDG.dcm'
reader = vtk.vtkDICOMImageReader()
reader.SetDirectoryName(os.path.dirname(name_file))
# reader.SetDirectoryName(name_file)
# reader.SetFileName(name_file)
reader.Update()
self.DICOMreader = reader
self._imagePositionPatient = reader.GetImagePositionPatient()
self._imageOrientationPatient = reader.GetImageOrientationPatient()
self._transferSyntaxUID = reader.GetTransferSyntaxUID()
self._studyID = reader.GetStudyID()
self._descriptiveName = reader.GetDescriptiveName()
print('test')
[docs]
class DicomReader:
def __init__(self, _file_init=None):
self.path_ = _file_init
# self.path_ = 'C:\\Users\\pedro\OneDrive - Universidade de Aveiro\\PhD\\' \
# 'Simulations\\SimulationIPET\\IPET_DerenzoSmall_500uCi_Na22_ListMode\\whole_body\\70\\IM50_f0_s69ID_ListMode.npy[18F]-FDG.dcm'
#
# self.path_ = 'C:\\Users\\pedro\\OneDrive - Universidade de Aveiro\\Testes\\UA-V64\\V64_SR\\' \
# 'Easypet Scan 09 Jun 2022 - 17h 16m 54s\\dynamic_image\\15\\IM0_f0_s15ID_SR-NEMA[22]-Na .dcm'
self._dicomHeaders = None
self._volumes = None
@property
def dicomHeaders(self):
return self._dicomHeaders
[docs]
def volumes(self):
return self._volumes
[docs]
def readDirectory(self):
# config.data_element_callback = fix_sop_class
file_folder = os.path.dirname(self.path_)
dicom_files = [path.join(file_folder, _) for _ in listdir(file_folder) if _.endswith(".dcm")]
self._dicomHeaders = [None for i in range(len(dicom_files))]
fs = dcmread(dicom_files[0], force=True)
print(fs)
self._volumes = np.zeros((fs.Columns, fs.Rows, fs.NumberOfSlices, fs.NumberOfTimeSlices), dtype=np.float32)
print("Image Memory:",
self._volumes.size * self._volumes.itemsize)
for file in dicom_files:
fs = dcmread(file, force=True)
order = fs.ImageIndex
k = order % fs.NumberOfSlices
l = order // fs.NumberOfSlices
self._dicomHeaders[order] = fs
self._volumes[:, :, k, l] = fs.pixel_array * fs.RescaleSlope
# fs = read_dicomdir(path)7
# print(fs.PixelData)
# self._volumes *= fs.RescaleSlope
# self._volumes = self._volumes.T
# print(fs)
# # root_dir = Path(fs.filename).resolve().parent
# # print(f'Root directory: {root_dir}\n')
# # A summary of the File-set's contents can be seen when printing
# print(fs)
# print()
#
# # Iterating over the FileSet yields FileInstance objects
# for instance in fs:
# # Load the corresponding SOP Instance dataset
# ds = instance.load()
# # Do something with each dataset
#
# # We can search the File-set
# patient_ids = fs.find_values("PatientID")
# for patient_id in patient_ids:
# # Returns a list of FileInstance, where each one represents an available
# # SOP Instance with a matching *Patient ID*
# result = fs.find(PatientID=patient_id)
# print(
# f"PatientName={result[0].PatientName}, "
# f"PatientID={result[0].PatientID}"
# )
#
# # Search available studies
# study_uids = fs.find_values("StudyInstanceUID", instances=result)
# for study_uid in study_uids:
# result = fs.find(PatientID=patient_id, StudyInstanceUID=study_uid)
# print(
# f" StudyDescription='{result[0].StudyDescription}', "
# f"StudyDate={result[0].StudyDate}"
# )
#
# # Search available series
# series_uids = fs.find_values("SeriesInstanceUID", instances=result)
# for series_uid in series_uids:
# result = fs.find(
# PatientID=patient_id,
# StudyInstanceUID=study_uid,
# SeriesInstanceUID=series_uid
# )
# plural = ['', 's'][len(result) > 1]
#
# print(
# f" Modality={result[0].Modality} - "
# f"{len(result)} SOP Instance{plural}"
# )
#
# # Of course you can just get the instances directly if you know what you want
# series_uid = "1.3.6.1.4.1.5962.1.1.0.0.0.1196533885.18148.0.118"
# result = fs.find(SeriesInstanceUID=series_uid)
# print(f"\nFound {len(result)} instances for SeriesInstanceUID={series_uid}")
#
# # We can search the actual stored SOP Instances by using `load=True`
# # This can be useful as the DICOMDIR's directory records only contain a
# # limited subset of the available elements, however its less efficient
# result = fs.find(load=False, PhotometricInterpretation="MONOCHROME1")
# result_load = fs.find(load=True, PhotometricInterpretation="MONOCHROME1")
# print(
# f"Found {len(result)} instances with "
# f"PhotometricInterpretation='MONOCHROME1' without loading the stored "
# f"instances and {len(result_load)} instances with loading"
# )
# # We can remove and add instances to the File-set
# fs.add(get_testdata_file("CT_small.dcm"))
# fs.add(get_testdata_file("MR_small.dcm"))
# result = fs.find(StudyDescription="'XR C Spine Comp Min 4 Views'")
# fs.remove(result)
#
# # To edit the elements in the DICOMDIR's File-set Identification Module
# # (Part 3, Annex F.3.2.1) use the following properties:
# # (0004,1130) File-set ID
# fs.ID = "MY FILESET"
# # Change the File-set's UID
# fs.UID = generate_uid()
# # (0004,1141) File-set Descriptor File ID
# fs.descriptor_file_id = "README"
# # (0004,1142) Specific Character Set of File-set Descriptor File
# fs.descriptor_character_set = "ISO_IR 100"
#
# # Changes to the File-set are staged until write() is called
# # Calling write() will update the File-set's directory structure to meet the
# # semantics used by pydicom File-sets (if required), add/remove instances and
# # and re-write the DICOMDIR file
# # We don't do it here because it would overwrite your example data
# # fs.write()
#
# # Alternatively, the File-set can be copied to a new root directory
# # This will apply any staged changes while leaving the original FileSet
# # object unchanged
# tdir = TemporaryDirectory()
# new_fileset = fs.copy(tdir.name)
# print(f"\nOriginal File-set still at {fs.path}")
# root = Path(new_fileset.path)
# print(f"File-set copied to {root} and contains the following files:")
# # Note how the original File-set directory layout has been changed to
# # the structure used by pydicom
# for p in sorted(root.glob('**/*')):
# if p.is_file():
# print(f" {p.relative_to(root)}")
if __name__ =="__main__":
d = DicomReader()
d.readDirectory()
# DicomVTKReader()