PanTS_Website / handle.py
jen900704's picture
Upload 40 files
e9406c7 verified
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()