-
Notifications
You must be signed in to change notification settings - Fork 102
Global radiomics feature calculation parameters
Parameters used for radiomics calculation are supplied via a user-defined JSON file. Users can create a copy of the template JSON file and modify the settings as needed. The following sections describe various elements of radiomics settings in detail.
Names of structures used in feature extraction are specified via the structures
field. Users can standardize structure names by using the CERR+ tool.
Example
Defining two input structures, roi1
and roi2
"structures": ["roi1","roi2"]
Radiomic features can be calculated using the original scanned image or derived images. Supported image types include 'Original','HaralickCooccurance', 'LawsConvolution', 'LawsEnergy','Wavelets','Gabor','LoG', 'Sobel', 'FirstOrderStatistics', 'Mean', and 'CoLlage'. SimpleITK filters can be invoked by setting the image type to 'SimpleITK'. Sample settings are provided for each of the supported image types.
An example definition of imageType
field with original
and wavelet
filtered images is as shown below:
"imageType": {
"Original": {},
"Wavelets": {
"Wavelets": "Haar",
"Index": "",
"Direction": "HLH"
}
}
It is possible to specify multiple parameters for the same class of the derived image as a list of parameter dictionaries. For example, to extract radiomics from different directional filtered wavelet
images:
"imageType": {
"Original": {},
"Wavelets": [{
"Wavelets": "Haar",
"Index": "",
"Direction": "HLH"
},
{
"Wavelets": "Haar",
"Index": "",
"Direction": "HHH"
}]
}
Settings for various types of radiomics features are specified within the settings
dictionary. Additionally, the perturbation
dictionary specifies the sequence of perturbation chains (Zwanenburg et al) to be applied before feature extraction. This dictionary can be left empty in case no perturbation is to be applied. Note that this dictionary will be left empty for radiomics extraction for outcomes modeling.
"settings": {
"padding": { # If left empty, the ROI is padded through expansion by [5,5,5] voxels
"method": "expand", # Padding method. Supported options include "expand","padzeros",
# "circular","replicate","symmetric", and "none".
"size": [5,5,5] # Amount of padding [no. rows, no. cols, no. slices]
},
"resample": { # Leave empty if no resampling is applied
"resolutionXCm": 0.1, # resampling resolution in L-R
"resolutionYCm": 0.1, # resampling resolution in A-P
"resolutionZCm": 0.1, # resampling resolution in S-I
"interpMethod": "sinc" # Interpolation method. Supported options
# include "linear", "cubic", "neareast", and "sinc".
# NOTE: Masks are resampled using the "linear" method
# and binarized using threshold=0.5.
},
"perturbation": { # Leave empty if no perturbation is required
"sequence": "RV", # any combination of RVCT
"angle2DStdDeg": 7, # std dev to sample angle from normal distribution.
"volScaleStdFraction": 0.01, # std dev to sample volume scale from normal distribution.
"superPixVol": 0.005 # volume of super pixel in cc
},
"firstOrder" :{
"binWidthEntropy": 25, #Used to discretize image for entropy calculation.
"offsetForEnergy": 0 # Typically, set to 1000 for CT scans and 0 for other modalities with (+)ve image intensities.
},
"texture" :{
"numGrLevels": [], # number of gray levels to use. Leave empty to use a fixed binwidth.
"binwidth": 25, # binwidth to discretize an image.
"minSegThreshold": -500, # minimum segmentation threshold. Segmentation mask is adjusted to exclude voxels below this value.
"maxSegThreshold": 1000, # maximum segmentation threshold. Segmentation mask is adjusted to exclude voxels above this value.
"minClipIntensity": -500, # minimum clipping intensity. Values less than this are clipped to this value. Clipping is used to ensure identical bins (same start & end intensities across a cohort). Can be left empty to use min intensity from the dataset.
"maxClipIntensity": 1000, # maximum clipping intensity. Values greater than this are clipped to this value. Clipping is used to ensure identical bins (same start & end intensities across a cohort). Can be left empty to use max intensity from the dataset.
"directionality": "2D", # "2D" (4 directional offsets are used - 0,45,90,135) or "3D" (13 directional offsets are used)
"avgType": "feature", # "feature" (average of features from different offsets) or "textureMatrix" (feature resulting from texture matrix averaged across different offsets)
"voxelOffset": 1, # voxel neighbor distance for Haralick texture calculation.
"patchRadiusVox": [3, 3, 3], # patch radius for NGTDM and NGLDM features. Resulting patches are of size 2*patchRadiusVox + 1
"imgDiffThresh": 10 # difference threshold for NGTDM and NGLDM features.
},
"shape" :{
"rcs": [] # [numRows, numCols, numSlics] to resample scan for shape calculation.. This should be chosen to create a fine enough mesh without too much computational overload. Leave empty to use the resolution same as that of the image.
},
"peakValley" :{
"peakRadius": [2, 2, 0], # neighborhood patch radius for averaging intensities.
"units": "vox" # Supported options: "vox" (voxels), "cm" (physical units).
},
"ivh" :{
"binwidth": 0.1,
"xForIxCc": [200,300,400], # Vector of absolute intensities (e.g. -50:20:100 for CT, 0:2:28; % PET SUV).
"xForIxPct": [20, 30, 40], # Vector of percentage volumes
"xForVxAbs": [0, 10, 30], # Vector of absolute volumes [cc]
"xForVxPct": [10, 30, 30] # Vector of percent intensity cutoff
}
}
Extraction of features belonging to a particular class is specified via featureClass
dictionary. The dictionary for each feature class contains the featureList
field which lists the features required for that class. If featureList
contains all
, then all features will be generated for that class.
"featureClass":{
"shape": {
"featureList": ["compactness","sphericity"]
},
"firstOrder": {
"featureList": ["totalEnergy"]
},
"glcm": {
"featureList": ["all"]
},
"glrlm": {
"featureList": ["RLN"]
},
"glszm": {
},
"gldm": {
},
"gtdm": {
}
}