Spaces:
Sleeping
Sleeping
| import nibabel as nib | |
| import numpy as np | |
| from constants import Constants | |
| from utils import removeFileExt | |
| import scipy.ndimage as ndimage | |
| import os | |
| # def combine_labels(files, session_key): | |
| # filenames = list(files.keys()) | |
| # filenames.remove('MAIN_NIFTI') | |
| # base = os.path.join('sessions', session_key) #base dir path | |
| # os.makedirs(os.path.join(base, 'segmentations')) | |
| # main_nifti = files['MAIN_NIFTI'] | |
| # main_nifti.save(os.path.join(base, main_nifti_filename)) | |
| # print(filenames) | |
| # aorta = files['aorta.nii.gz'] | |
| # nib.Nifti1Image.from_bytes(aorta.read()) | |
| # return | |
| def voxelThreshold(slice): | |
| num_voxels = len(slice[slice > 0]) | |
| return num_voxels < Constants.VOXEL_THRESHOLD | |
| def getCalcVolumeState(img_data, organ): | |
| if organ in Constants.organ_ids_volumeNA: | |
| return "NA" # blood vessel, volume is NA | |
| slices = [ | |
| img_data[:, :, 0], | |
| img_data[:, :, -1], | |
| img_data[0, :, :], | |
| img_data[-1, :, :], | |
| img_data[:, 0, :], | |
| img_data[:, -1, :], | |
| ] | |
| for slice in slices: | |
| if voxelThreshold(slice) is False: | |
| return "incomplete" | |
| return "complete" | |
| def processMasks(sessionKey): | |
| data = {"data": []} | |
| ct = nib.load(os.path.join('sessions', sessionKey, Constants.main_nifti_filename)).get_fdata() | |
| organ_ids = os.listdir(os.path.join('sessions', sessionKey, 'segmentations')) | |
| print(organ_ids) | |
| for i in range(len(organ_ids)): | |
| organ_data = {} | |
| organ_data['id'] = removeFileExt(organ_ids[i]) | |
| img = nib.load(os.path.join('sessions', sessionKey, 'segmentations', organ_ids[i])) | |
| img_data = img.get_fdata() | |
| state = getCalcVolumeState(img_data, organ_ids[i]) | |
| if state == "complete": | |
| volume_cm = round(float(nib.imagestats.mask_volume(img)/1000), Constants.DECIMAL_PRECISION_VOLUME) | |
| organ_data['volume_cm'] = volume_cm | |
| elif state == "incomplete": | |
| organ_data['volume_cm'] = "Incomplete organ" | |
| elif state == "NA": | |
| organ_data['volume_cm'] = "N/A" | |
| erosion_data = ndimage.binary_erosion(img_data, structure=Constants.STRUCTURING_ELEMENT) | |
| hu_values = ct[erosion_data > 0] | |
| if len(hu_values) == 0: | |
| organ_data['mean_hu'] = 'N/A' | |
| else: | |
| mean_hu = round(float(np.mean(hu_values)), Constants.DECIMAL_PRECISION_HU) | |
| organ_data['mean_hu'] = mean_hu | |
| data['data'].append(organ_data) | |
| return data | |
| # def test(): | |
| # for organ in organ_ids: | |
| # mask = nib.load(f'dev/segmentations/{organ}.nii.gz').get_fdata() | |
| # for i in range(mask.shape[2]): | |
| # slice = mask[:, :, i] | |
| # length = len(slice[slice > 0]) | |
| # if length > 0: | |
| # print(organ) | |
| # print('num voxels: ', length) | |
| # break | |
| # for i in range(mask.shape[2]-1, -1, -1): | |
| # slice = mask[:, :, i] | |
| # length = len(slice[slice > 0]) | |
| # if length > 0: | |
| # print(organ) | |
| # print('num voxels: ', length) | |
| # break | |
| # for i in range(mask.shape[0]): | |
| # slice = mask[i, :, :] | |
| # length = len(slice[slice > 0]) | |
| # if length > 0: | |
| # print(organ) | |
| # print('num voxels: ', length) | |
| # break | |
| # for i in range(mask.shape[0]-1, -1, -1): | |
| # slice = mask[i, :, :] | |
| # length = len(slice[slice > 0]) | |
| # if length > 0: | |
| # print(organ) | |
| # print('num voxels: ', length) | |
| # break | |
| # for i in range(mask.shape[1]): | |
| # slice = mask[:, i, :] | |
| # length = len(slice[slice > 0]) | |
| # if length > 0: | |
| # print(organ) | |
| # print('num voxels: ', length) | |
| # break | |
| # for i in range(mask.shape[1]-1, -1, -1): | |
| # slice = mask[:, i, :] | |
| # length = len(slice[slice > 0]) | |
| # if length > 0: | |
| # print(organ) | |
| # print('num voxels: ', length) | |
| # break | |
| # test() |