File size: 5,755 Bytes
ed5ac4a a27d55f ed5ac4a |
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 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 128 129 130 131 132 133 134 135 136 137 138 139 140 141 142 143 144 145 146 |
import os, sys
currentdir = os.path.dirname(os.path.realpath(__file__))
parentdir = os.path.dirname(currentdir)
sys.path.append(parentdir) # PYTHON > 3.3 does not allow relative referencing
import h5py
import numpy as np
import zipfile
import re
import dicom2nifti as d2n
import nibabel as nib
from ddmr.utils.nifti_utils import save_nifti
from ddmr.utils.misc import try_mkdir
from tqdm import tqdm
import shutil
IRCA_PATH = '/mnt/EncryptedData1/Users/javier/vessel_registration/3Dirca/'
SEGMENTATIONS = ('venoussystem', 'venacava', 'portalvein', 'liver', 'livertumor')
SEGS_VESSELS = ('venoussystem', 'venacava', 'portalvein')
SEGS_PARENCH = ('liver',)
SEGS_TUMOR = ('livertumor', 'tumor', 'liverkyst', 'livercyst')
SEGMENTATIONS = (SEGS_PARENCH + SEGS_VESSELS + SEGS_TUMOR)
DEST_FOLDER = os.path.join(IRCA_PATH, 'nifti3')
ZIP_EXT = '.zip'
NIFTI_EXT = '.nii.gz'
H5_EXT = '.hd5'
PATIENT_DICOM = 'PATIENT_DICOM'
TEMP = 'temp'
SEGS_DICOM = 'MASKS_DICOM'
CONVERTED_FILE = 'none' + NIFTI_EXT
VOL_FILE = 'volume-{:04d}' + NIFTI_EXT
SEG_FILE = 'segmentation-{:04d}' + NIFTI_EXT
SEG_TO_CT_ORIENTATION_MAT = np.eye(4)
SEG_TO_CT_ORIENTATION_MAT[0] = -1
def merge_segmentations(file_list):
nib_file = nib.concat_images(file_list)
np_file = np.asarray(nib_file.dataobj)
np_file = np.sign(np.sum(np_file, -1)) * np.max(np_file)
return nib.Nifti1Image(np_file, nib_file.affine)
if __name__ == '__main__':
# 1. List of folders
folder_list = [os.path.join(IRCA_PATH, d) for d in os.listdir(IRCA_PATH) if d.lower().startswith('3dircadb1.')]
folder_list.sort()
try_mkdir(DEST_FOLDER)
folder_iter = tqdm(folder_list)
for pat_dir in folder_iter:
pat_dir = folder_list[13]
i = int(pat_dir.split('.')[-1])
# 2. Unzip PATIENT_DICOM.zip
temp_folder = os.path.join(pat_dir, TEMP)
folder_iter.set_description('Volume DICOM: Unzipping PATIENT_DICOM.zip')
zipfile.ZipFile(os.path.join(pat_dir, PATIENT_DICOM + ZIP_EXT)).extractall(temp_folder)
folder_iter.set_description('Volume DICOM: Converting DICOM to Nifti')
d2n.convert_directory(os.path.join(temp_folder, PATIENT_DICOM), os.path.join(temp_folder, PATIENT_DICOM))
os.rename(os.path.join(temp_folder, PATIENT_DICOM, CONVERTED_FILE), os.path.join(DEST_FOLDER, VOL_FILE.format(i)))
folder_iter.set_description('Volume DICOM: CT stored in: ' + os.path.join(DEST_FOLDER, VOL_FILE.format(i)))
# os.rename also moves the file to the destination path. So the original one ceases to exist
# 3. Unzip MASKS_DICOM.zip
folder_iter.set_description('Segmentations DICOM: Unzipping MASKS_DICOM.zip')
zipfile.ZipFile(os.path.join(pat_dir, SEGS_DICOM + ZIP_EXT)).extractall(temp_folder)
seg_nib = list()
seg_ves = list()
seg_par = list()
seg_tumor = list()
seg_dirs = list()
for root, dir_list, file_list in os.walk(os.path.join(temp_folder, SEGS_DICOM)):
for fold in dir_list:
if fold.startswith(SEGMENTATIONS):
# if 'liverkyst' in fold:
# continue
# else:
seg_dirs.append(fold)
seg_dirs.sort()
for fold in seg_dirs:
folder_iter.set_description('Segmentations DICOM: Converting ' + fold)
d2n.convert_directory(os.path.join(temp_folder, SEGS_DICOM, fold),
os.path.join(temp_folder, SEGS_DICOM))
os.rename(os.path.join(temp_folder, SEGS_DICOM, CONVERTED_FILE),
os.path.join(temp_folder, SEGS_DICOM, fold + '_nifti_' + NIFTI_EXT))
if fold.startswith(SEGS_VESSELS):
seg_ves.append(os.path.join(temp_folder, SEGS_DICOM, fold + '_nifti_' + NIFTI_EXT))
elif fold.startswith(SEGS_TUMOR):
seg_tumor.append(os.path.join(temp_folder, SEGS_DICOM, fold + '_nifti_' + NIFTI_EXT))
elif fold.startswith(SEGS_PARENCH):
seg_par.append(os.path.join(temp_folder, SEGS_DICOM, fold + '_nifti_' + NIFTI_EXT))
else:
continue
folder_iter.set_description('Segmentations DICOM: Concatenating segmentations')
# Merge the vessel segmentations
segs_to_merge = tuple()
if len(seg_par) > 1:
segs_to_merge += (merge_segmentations(seg_par),)
else:
segs_to_merge += tuple(seg_par) # seg_par is a list
if len(seg_ves) > 1:
segs_to_merge += (merge_segmentations(seg_ves),)
else:
segs_to_merge += tuple(seg_ves) # seg_ves is a list
if len(seg_tumor) > 1:
segs_to_merge += (merge_segmentations(seg_tumor),)
else:
segs_to_merge += tuple(seg_tumor) # seg_tumor is a list
# # Merge the tumors segmentations
# if len(seg_tumor):
# segs_to_merge.append(merge_segmentations(seg_tumor))
# else:
# print('No tumors found in ' + pat_dir)
# Merge with the parenchyma and save
folder_iter.set_description('Segmentations DICOM: Saving segmentations')
if len(segs_to_merge) > 1:
nib.save(nib.concat_images(segs_to_merge, check_affines=True), os.path.join(DEST_FOLDER, SEG_FILE.format(i)))
else:
nib.save(segs_to_merge[0], os.path.join(DEST_FOLDER, SEG_FILE.format(i)))
folder_iter.set_description('Segmentations DICOM: Segmentation stored in ' + os.path.join(DEST_FOLDER, SEG_FILE.format(i)))
shutil.rmtree(temp_folder)
folder_iter.set_description('Temporal file deleted')
# 4. Load DICOM and transform to nifti
# 5. Store as nifty in hd5
|