Source code for MEDiml.biomarkers.diagnostics
from typing import Dict
import numpy as np
from ..processing.segmentation import compute_bounding_box
[docs]
def extract_all(vol_obj: np.ndarray,
roi_obj_int: np.ndarray,
roi_obj_morph: np.ndarray,
im_type: str) -> Dict:
"""Computes diagnostic features
The diagnostic features help identify issues with
the implementation of the image processing sequence.
Args:
vol_obj (ndarray): Imaging data.
roi_obj_int (ndarray): Intensity mask data.
roi_obj_morph (ndarray): Morphological mask data.
im_type (str): Image processing step.
- 'reSeg': Computes Diagnostic features right after the re-segmentaion step.
- 'interp' or any other arg: Computes Diagnostic features for any processing step other than re-segmentation.
Returns:
Dict: Dictionnary containing the computed features.
"""
diag = {}
# FOR THE IMAGE
if im_type != 'reSeg':
# Image dimension x
diag.update({'image_' + im_type + '_dimX':
vol_obj.spatialRef.ImageSize[0]})
# Image dimension y
diag.update({'image_' + im_type + '_dimY':
vol_obj.spatialRef.ImageSize[1]})
# Image dimension z
diag.update({'image_' + im_type + '_dimz':
vol_obj.spatialRef.ImageSize[2]})
# Voxel dimension x
diag.update({'image_' + im_type + '_voxDimX':
vol_obj.spatialRef.PixelExtentInWorldX})
# Voxel dimension y
diag.update({'image_' + im_type + '_voxDimY':
vol_obj.spatialRef.PixelExtentInWorldY})
# Voxel dimension z
diag.update({'image_' + im_type + '_voxDimZ':
vol_obj.spatialRef.PixelExtentInWorldZ})
# Mean intensity
diag.update({'image_' + im_type + '_meanInt': np.mean(vol_obj.data)})
# Minimum intensity
diag.update({'image_' + im_type + '_minInt': np.min(vol_obj.data)})
# Maximum intensity
diag.update({'image_' + im_type + '_maxInt': np.max(vol_obj.data)})
# FOR THE ROI
box_bound_int = compute_bounding_box(roi_obj_int.data)
box_bound_morph = compute_bounding_box(roi_obj_morph.data)
x_gl_int = vol_obj.data[roi_obj_int.data == 1]
x_gl_morph = vol_obj.data[roi_obj_morph.data == 1]
# Map dimension x
diag.update({'roi_' + im_type + '_Int_dimX':
roi_obj_int.spatialRef.ImageSize[0]})
# Map dimension y
diag.update({'roi_' + im_type + '_Int_dimY':
roi_obj_int.spatialRef.ImageSize[1]})
# Map dimension z
diag.update({'roi_' + im_type + '_Int_dimZ':
roi_obj_int.spatialRef.ImageSize[2]})
# Bounding box dimension x
diag.update({'roi_' + im_type + '_Int_boxBoundDimX':
box_bound_int[0, 1] - box_bound_int[0, 0] + 1})
# Bounding box dimension y
diag.update({'roi_' + im_type + '_Int_boxBoundDimY':
box_bound_int[1, 1] - box_bound_int[1, 0] + 1})
# Bounding box dimension z
diag.update({'roi_' + im_type + '_Int_boxBoundDimZ':
box_bound_int[2, 1] - box_bound_int[2, 0] + 1})
# Bounding box dimension x
diag.update({'roi_' + im_type + '_Morph_boxBoundDimX':
box_bound_morph[0, 1] - box_bound_morph[0, 0] + 1})
# Bounding box dimension y
diag.update({'roi_' + im_type + '_Morph_boxBoundDimY':
box_bound_morph[1, 1] - box_bound_morph[1, 0] + 1})
# Bounding box dimension z
diag.update({'roi_' + im_type + '_Morph_boxBoundDimZ':
box_bound_morph[2, 1] - box_bound_morph[2, 0] + 1})
# Voxel number
diag.update({'roi_' + im_type + '_Int_voxNumb': np.size(x_gl_int)})
# Voxel number
diag.update({'roi_' + im_type + '_Morph_voxNumb': np.size(x_gl_morph)})
# Mean intensity
diag.update({'roi_' + im_type + '_meanInt': np.mean(x_gl_int)})
# Minimum intensity
diag.update({'roi_' + im_type + '_minInt': np.min(x_gl_int)})
# Maximum intensity
diag.update({'roi_' + im_type + '_maxInt': np.max(x_gl_int)})
return diag