Secure your code as it's written. Use Snyk Code to scan source code in minutes - no build needed - and fix issues immediately.
be returned. Otherwise, only new labels image will be returned.
See Also
--------
nilearn.datasets.fetch_atlas_harvard_oxford : For an example of atlas with
labels.
nilearn.regions.RegionExtractor : A class can be used for region extraction
on continuous type atlas images.
nilearn.regions.connected_regions : A function used for region extraction
on continuous type atlas images.
"""
labels_img = check_niimg_3d(labels_img)
labels_data = _safe_get_data(labels_img, ensure_finite=True)
affine = labels_img.affine
check_unique_labels = np.unique(labels_data)
if min_size is not None and not isinstance(min_size, numbers.Number):
raise ValueError("Expected 'min_size' to be specified as integer. "
"You provided {0}".format(min_size))
if not isinstance(connect_diag, bool):
raise ValueError("'connect_diag' must be specified as True or False. "
"You provided {0}".format(connect_diag))
if np.any(check_unique_labels < 0):
raise ValueError("The 'labels_img' you provided has unknown/negative "
"integers as labels {0} assigned to regions. "
"All regions in an image should have positive "
"integers assigned as labels."
.format(check_unique_labels))
resampling_interpolation='continuous',
threshold=None, **kwargs):
img = reorder_img(img, resample=resampling_interpolation)
threshold = float(threshold) if threshold is not None else None
if threshold is not None:
data = _utils.niimg._safe_get_data(img, ensure_finite=True)
if threshold == 0:
data = np.ma.masked_equal(data, 0, copy=False)
else:
data = np.ma.masked_inside(data, -threshold, threshold,
copy=False)
img = new_img_like(img, data, img.affine)
affine = img.affine
data = _utils.niimg._safe_get_data(img, ensure_finite=True)
data_bounds = get_bounds(data.shape, affine)
(xmin, xmax), (ymin, ymax), (zmin, zmax) = data_bounds
xmin_, xmax_, ymin_, ymax_, zmin_, zmax_ = \
xmin, xmax, ymin, ymax, zmin, zmax
# Compute tight bounds
if type in ('contour', 'contourf'):
# Define a pseudo threshold to have a tight bounding box
if 'levels' in kwargs:
thr = 0.9 * np.min(np.abs(kwargs['levels']))
else:
thr = 1e-6
not_mask = np.logical_or(data > thr, data < -thr)
xmin_, xmax_, ymin_, ymax_, zmin_, zmax_ = \
get_mask_bounds(new_img_like(img, not_mask, affine))
See Also
--------
nilearn.plotting.plot_anat : To simply plot anatomical images
nilearn.plotting.plot_epi : To simply plot raw EPI images
nilearn.plotting.plot_glass_brain : To plot maps in a glass brain
""" # noqa: E501
# dim the background
bg_img, black_bg, bg_vmin, bg_vmax = _load_anat(bg_img, dim=dim,
black_bg=black_bg)
stat_map_img = _utils.check_niimg_3d(stat_map_img, dtype='auto')
cbar_vmin, cbar_vmax, vmin, vmax = _get_colorbar_and_data_ranges(
_safe_get_data(stat_map_img, ensure_finite=True),
vmax,
symmetric_cbar,
kwargs)
display = _plot_img_with_bg(
img=stat_map_img, bg_img=bg_img, cut_coords=cut_coords,
output_file=output_file, display_mode=display_mode,
figure=figure, axes=axes, title=title, annotate=annotate,
draw_cross=draw_cross, black_bg=black_bg, threshold=threshold,
bg_vmin=bg_vmin, bg_vmax=bg_vmax, cmap=cmap, vmin=vmin, vmax=vmax,
colorbar=colorbar, cbar_vmin=cbar_vmin, cbar_vmax=cbar_vmax,
resampling_interpolation=resampling_interpolation, **kwargs)
return display
Note: It is advised to check the mask image with your own data processing.
See Also
--------
nilearn.datasets.fetch_icbm152_2009: for details regarding the ICBM152
template.
nilearn.datasets.load_mni152_template: for details about version of MNI152
template and related.
"""
# Fetching ICBM152 grey matter mask image
icbm = fetch_icbm152_2009(data_dir=data_dir, resume=resume, verbose=verbose)
gm = icbm['gm']
gm_img = check_niimg(gm)
gm_data = niimg._safe_get_data(gm_img)
# getting one fifth of the values
gm_mask = (gm_data > threshold)
gm_mask = ndimage.binary_closing(gm_mask, iterations=2)
gm_mask_img = new_img_like(gm_img, gm_mask)
return gm_mask_img
if mask_img is not None:
mask_img = _utils.check_niimg_3d(mask_img)
if mask_img.shape != target_shape:
raise ValueError("mask_img and imgs shapes must be identical.")
if abs(mask_img.affine - target_affine).max() > 1e-9:
raise ValueError("mask_img and imgs affines must be identical")
# Perform computation
labels_data = _safe_get_data(labels_img, ensure_finite=True)
labels = list(np.unique(labels_data))
if background_label in labels:
labels.remove(background_label)
if mask_img is not None:
mask_data = _safe_get_data(mask_img, ensure_finite=True)
labels_data = labels_data.copy()
labels_data[np.logical_not(mask_data)] = background_label
data = _safe_get_data(imgs)
target_datatype = np.float32 if data.dtype == np.float32 else np.float64
# Nilearn issue: 2135, PR: 2195 for why this is necessary.
signals = np.ndarray((data.shape[-1], len(labels)), order=order,
dtype=target_datatype)
reduction_function = getattr(ndimage.measurements, strategy)
for n, img in enumerate(np.rollaxis(data, -1)):
signals[n] = np.asarray(reduction_function(img,
labels=labels_data,
index=labels))
# Set to zero signals for missing labels. Workaround for Scipy behaviour
missing_labels = set(labels) - set(np.unique(labels_data))
labels_index = dict([(l, n) for n, l in enumerate(labels)])
niimgs = []
for image in imgs.values():
niimgs.append(check_niimg(image))
_check_same_fov(*niimgs, raise_error=True)
except Exception as exc:
exc.args = (("Input images cannot be compared, you provided '{0}',"
.format(imgs.values()),) + exc.args)
raise
# Computing input data as a dictionary of numpy arrays. Keep a reference
# niimg for building the result as a new niimg.
niimg = None
data_dict = {}
for key, img in imgs.items():
niimg = check_niimg(img)
data_dict[key] = _safe_get_data(niimg)
# Add a reference to numpy in the kwargs of eval so that numpy functions
# can be called from there.
data_dict['np'] = np
try:
result = eval(formula, data_dict)
except Exception as exc:
exc.args = (("Input formula couldn't be processed, you provided '{0}',"
.format(formula),) + exc.args)
raise
return new_img_like(niimg, result, niimg.affine)
imgs_img = _utils.check_niimg(imgs)
affine = imgs_img.get_affine()[:3, :3]
if not np.allclose(mask_affine, imgs_img.get_affine()):
raise ValueError('Mask affine: \n%s\n is different from img affine:'
'\n%s' % (str(mask_affine),
str(imgs_img.get_affine())))
if not mask_data.shape == imgs_img.shape[:3]:
raise ValueError('Mask shape: %s is different from img shape:%s'
% (str(mask_data.shape), str(imgs_img.shape[:3])))
# All the following has been optimized for C order.
# Time that may be lost in conversion here is regained multiple times
# afterward, especially if smoothing is applied.
series = _safe_get_data(imgs_img)
if dtype == 'f':
if series.dtype.kind == 'f':
dtype = series.dtype
else:
dtype = np.float32
series = _utils.as_ndarray(series, dtype=dtype, order="C",
copy=True)
del imgs_img # frees a lot of memory
# Delayed import to avoid circular imports
from .image.image import _smooth_array
_smooth_array(series, affine, fwhm=smoothing_fwhm,
ensure_finite=ensure_finite, copy=False)
return series[mask_data].T
def _map_show(self, img, type='imshow',
resampling_interpolation='continuous',
threshold=None, **kwargs):
img = reorder_img(img, resample=resampling_interpolation)
threshold = float(threshold) if threshold is not None else None
if threshold is not None:
data = _utils.niimg._safe_get_data(img, ensure_finite=True)
if threshold == 0:
data = np.ma.masked_equal(data, 0, copy=False)
else:
data = np.ma.masked_inside(data, -threshold, threshold,
copy=False)
img = new_img_like(img, data, img.affine)
affine = img.affine
data = _utils.niimg._safe_get_data(img, ensure_finite=True)
data_bounds = get_bounds(data.shape, affine)
(xmin, xmax), (ymin, ymax), (zmin, zmax) = data_bounds
xmin_, xmax_, ymin_, ymax_, zmin_, zmax_ = \
xmin, xmax, ymin, ymax, zmin, zmax
# Compute tight bounds
an array of list of indices where each index denotes the identity
of each extracted region to their family of brain maps.
See Also
--------
nilearn.regions.connected_label_regions : A function can be used for
extraction of regions on labels based atlas images.
nilearn.regions.RegionExtractor : A class can be used for both
region extraction on continuous type atlas images and
also time series signals extraction from regions extracted.
"""
all_regions_imgs = []
index_of_each_map = []
maps_img = check_niimg(maps_img, atleast_4d=True)
maps = _safe_get_data(maps_img).copy()
affine = maps_img.affine
min_region_size = min_region_size / np.abs(np.linalg.det(affine[:3, :3]))
allowed_extract_types = ['connected_components', 'local_regions']
if extract_type not in allowed_extract_types:
message = ("'extract_type' should be given either of these {0} "
"You provided extract_type='{1}'").format(allowed_extract_types, extract_type)
raise ValueError(message)
if mask_img is not None:
if not _check_same_fov(maps_img, mask_img):
mask_img = resample_img(mask_img,
target_affine=maps_img.affine,
target_shape=maps_img.shape[:3],
interpolation="nearest")
mask_data, _ = masking._load_mask_img(mask_img)
def _json_view_data(bg_img, stat_map_img, mask_img, bg_min, bg_max, colors,
cmap, colorbar):
""" Create a json-like viewer object, and populate with base64 data.
Returns: json_view
"""
# Initialise brainsprite data structure
json_view = dict.fromkeys(['bg_base64', 'stat_map_base64', 'cm_base64',
'params', 'js_jquery', 'js_brainsprite'])
# Create a base64 sprite for the background
bg_sprite = BytesIO()
bg_data = _safe_get_data(bg_img, ensure_finite=True)
_save_sprite(bg_data, bg_sprite, bg_max, bg_min, None, 'gray', 'png')
json_view['bg_base64'] = _bytesIO_to_base64(bg_sprite)
# Create a base64 sprite for the stat map
stat_map_sprite = BytesIO()
data = _safe_get_data(stat_map_img, ensure_finite=True)
mask = _safe_get_data(mask_img, ensure_finite=True)
_save_sprite(data, stat_map_sprite, colors['vmax'], colors['vmin'],
mask, cmap, 'png')
json_view['stat_map_base64'] = _bytesIO_to_base64(stat_map_sprite)
# Create a base64 colormap
if colorbar:
stat_map_cm = BytesIO()
_save_cm(stat_map_cm, colors['cmap'], 'png')
json_view['cm_base64'] = _bytesIO_to_base64(stat_map_cm)