Helper Module for Deep Learning.
Source code for pynet.preprocessing.intensity
# -*- coding: utf-8 -*-
##########################################################################
# NSAp - Copyright (C) CEA, 2020
# Distributed under the terms of the CeCILL-B license, as published by
# the CEA-CNRS-INRIA. Refer to the LICENSE file or to
# http://www.cecill.info/licences/Licence_CeCILL-B_V1-en.html
# for details.
##########################################################################
"""
Common functions to normalize intensities.
Code: https://github.com/jcreinhold/intensity-normalization
"""
# Import
import warnings
import numpy as np
from .hist import get_largest_mode
from .hist import get_last_mode
from .hist import get_first_mode
[docs]def rescale(arr, mask=None, percentiles=(0, 100), dynamic=(0, 1)):
""" Performs a rescale of the image intensities to a certain range.
Parameters
----------
arr: array
the input data.
mask: array, default None
the brain mask.
percentiles: 2-uplet, default (0, 100)
percentile values of the input image that will be mapped. This
parameter can be used for contrast stretching.
dynamic: 2-uplet, default (0, 1)
the intensities range of the rescaled data.
Returns
-------
rescaled: array
the rescaled input data.
"""
if mask is not None:
values = arr[mask]
else:
values = arr
cutoff = np.percentile(values, percentiles)
rescaled = np.clip(arr, *cutoff)
rescaled -= rescaled.min() # [0, max]
array_max = rescaled.max()
if array_max == 0:
warnings.warn("Rescaling not possible due to division by zero.")
return arr
rescaled /= rescaled.max() # [0, 1]
out_range = dynamic[1] - dynamic[0]
rescaled *= out_range # [0, out_range]
rescaled += dynamic[0] # [out_min, out_max]
return rescaled
[docs]def zscore_normalize(arr, mask=None):
""" Performs a batch Z-score normalization.
Parameters
----------
arr: array
the input data.
mask: array, default None
the brain mask.
Returns
-------
normalized: array
the normalized input data.
"""
if mask is not None:
values = arr[mask == 1]
else:
values = arr
mean = values.mean()
std = values.std()
return (arr - mean) / std
[docs]def kde_normalize(arr, mask=None, modality="T1w", norm_value=1):
""" Use kernel density estimation to find the peak of the white
matter in the histogram of a skull-stripped image. Then normalize
intensitites to a normalization value.
Parameters
----------
arr: array
the input data.
mask: array, default None
the brain mask.
modality str, default 'T1w'
the modality (T1w, T2w, FLAIR, MD, last, largest, first).
norm_value: float, default 1
the new intensity value for the detected WM peak.
Returns
-------
normalized: array
the normalized input data.
"""
if mask is not None:
values = arr[mask == 1]
else:
values = arr[arr > arr.mean()]
if modality.lower() in ["t1w", "flair", "last"]:
wm_peak = get_last_mode(values)
elif modality.lower() in ["t2w", "largest'"]:
wm_peak = get_largest_mode(values)
elif modality.lower() in ["md", "first"]:
wm_peak = get_first_mode(voi)
else:
raise ValueError("Invalid modality specified.")
normalized = (arr / wm_peak) * norm_value
return normalized
Follow us
© 2019, pynet developers .
Inspired by AZMIND template.
Inspired by AZMIND template.