Source code for dipy.viz.horizon.util

import warnings

import numpy as np

from dipy.testing.decorators import warning_for_keywords


[docs] def check_img_shapes(images): """Check if the images have same shapes. It also provides details about the volumes are same or not. If the shapes are not equal it will return False for both shape and volume. Parameters ---------- images : list Returns ------- tuple tuple[0] = True, if shapes are equal. tuple[1] = True, if volumes are equal. """ if len(images) < 2: return (True, False) base_shape = images[0][0].shape[:3] volumed_data_shapes = [] for img in images: data, _, _ = unpack_image(img) data_shape = data.shape[:3] if data.ndim == 4: volumed_data_shapes.append(data.shape[3]) if base_shape != data_shape: return (False, False) return (True, len(set(volumed_data_shapes)) == 1)
[docs] def check_img_dtype(images): """Check supplied image dtype. If not supported numerical type, fallback to supported numerical types (either int32 or float 32). If non-numerical type, skip the data. Parameters ---------- images : list Each image is tuple of (data, affine). Returns ------- list Valid images from the provided images. """ valid_images = [] for idx, img in enumerate(images): data, affine, fname = unpack_image(img) if np.issubdtype(data.dtype, np.integer): if data.dtype != np.int32: msg = f"{data.dtype} is not supported, falling back to int32" warnings.warn(msg, stacklevel=2) img = (data.astype(np.int32), affine, fname) valid_images.append(img) elif np.issubdtype(data.dtype, np.floating): if data.dtype != np.float64 and data.dtype != np.float32: msg = f"{data.dtype} is not supported, falling back to float32" warnings.warn(msg, stacklevel=2) img = (data.astype(np.float32), affine, fname) valid_images.append(img) else: msg = f"skipping image {idx + 1}, passed image is not in numerical format" warnings.warn(msg, stacklevel=2) return valid_images
[docs] def show_ellipsis(text, text_size, available_size): """Apply ellipsis to the text. Parameters ---------- text : string Text required to be check for ellipsis. text_size : float Current size of the text in pixels. available_size : float Size available to fit the text. This will be used to truncate the text and show ellipsis. Returns ------- string Text after processing for ellipsis. """ if text_size > available_size: max_chars = int((available_size / text_size) * len(text)) ellipsis_text = f"...{text[-(max_chars - 3) :]}" return ellipsis_text return text
[docs] def unpack_image(img): """Unpack provided image data. Standard way to handle different value images. Parameters ---------- img : tuple An image can contain either (data, affine) or (data, affine, fname). Returns ------- tuple If img with (data, affine) it will convert to (data, affine, None). Otherwise it will be passed as it is. """ return _unpack_data(img)
[docs] def unpack_surface(surface): """Unpack surface data. Parameters ---------- surface : tuple It either contains (vertices, faces) or (vertices, faces, fname). Returns ------- tuple If surface with (vertices, faces) it will convert to (vertices, faces, None). Otherwise it will be passed as it is. """ data = _unpack_data(surface) if data[0].shape[-1] != 3: raise ValueError(f"Vertices do not have correct shape: {data[0].shape}") if data[1].shape[-1] != 3: raise ValueError(f"Faces do not have correct shape: {data[1].shape}") return data
def _unpack_data(data, return_size=3): result = [*data] if len(data) < return_size: result += (return_size - len(data)) * [None] return result
[docs] @warning_for_keywords() def check_peak_size(pams, *, ref_img_shape=None, sync_imgs=False): """Check shape of peaks. Parameters ---------- pams : PeaksAndMetrics Peaks and metrics. ref_img_shape : tuple, optional 3D shape of the image, by default None. sync_imgs : bool, optional True if the images are synchronized, by default False. Returns ------- bool If the peaks are aligned with images and other peaks. """ base_shape = pams[0].peak_dirs.shape[:3] for pam in pams: if pam.peak_dirs.shape[:3] != base_shape: return False if not ref_img_shape: return True return base_shape == ref_img_shape and sync_imgs