def test_reorder_img_mirror(): affine = np.array([[-1.1, -0., 0., 0.], [-0., -1.2, 0., 0.], [-0., -0., 1.3, 0.], [0., 0., 0., 1.]]) img = Nifti1Image(np.zeros((4, 6, 8)), affine=affine) reordered = reorder_img(img) np.testing.assert_allclose( get_bounds(reordered.shape, reordered.affine), get_bounds(img.shape, img.affine), )
def test_reorder_img_mirror(): affine = np.array([ [-1.1, -0., 0., 0.], [-0., -1.2, 0., 0.], [-0., -0., 1.3, 0.], [0., 0., 0., 1.] ]) img = Nifti1Image(np.zeros((4, 6, 8)), affine=affine) reordered = reorder_img(img) np.testing.assert_allclose( get_bounds(reordered.shape, reordered.affine), get_bounds(img.shape, img.affine), )
def get_mask_bounds(mask, affine): """ Return the world-space bounds occupied by a mask given an affine. Notes ----- The mask should have only one connect component. The affine should be diagonal or diagonal-permuted. """ (xmin, xmax), (ymin, ymax), (zmin, zmax) = get_bounds(mask.shape, affine) slices = ndimage.find_objects(mask) if len(slices) == 0: warnings.warn("empty mask", stacklevel=2) else: x_slice, y_slice, z_slice = slices[0] x_width, y_width, z_width = mask.shape xmin, xmax = (xmin + x_slice.start*(xmax - xmin)/x_width, xmin + x_slice.stop *(xmax - xmin)/x_width) ymin, ymax = (ymin + y_slice.start*(ymax - ymin)/y_width, ymin + y_slice.stop *(ymax - ymin)/y_width) zmin, zmax = (zmin + z_slice.start*(zmax - zmin)/z_width, zmin + z_slice.stop *(zmax - zmin)/z_width) return xmin, xmax, ymin, ymax, zmin, zmax
def reorder_affine(affine, shape): """ Modified from nilearn.image.resampling.reorder_img and nilearn.image.resampling.resample_img :param affine: :param shape: :return: """ Q, R = np.linalg.qr(affine[:3, :3]) _affine = np.diag(np.abs(np.diag(R))[np.abs(Q).argmax(axis=1)]) target_affine = np.eye(4) target_affine[:3, :3] = _affine transform_affine = np.linalg.inv(target_affine).dot(affine) (xmin, xmax), (ymin, ymax), (zmin, zmax) = get_bounds(shape[:3], transform_affine) offset = target_affine[:3, :3].dot([xmin, ymin, zmin]) target_affine[:3, 3] = offset return target_affine
def _add_arrows(self, t): """Adds arrows using matplotlib.quiver""" # Format 3D data data_list = [] extent_list = [] for display_ax in self.display.axes.values(): data = [] for k, direction in enumerate(self._ndvar.space._directions): vol = self._dir_imgs[k][t] try: vol_data = np.squeeze(vol.get_data()) data_2d = display_ax.transform_to_2d(vol_data, vol.affine) data_2d = np.squeeze(data_2d) except IndexError: # We are cutting outside the indices of the data data_2d = None data.append(data_2d) data_list.append(np.array(data)) data_bounds = get_bounds(vol_data.shape, vol.affine) if display_ax.direction == 'y': (xmin, xmax), (_, _), (zmin, zmax) = data_bounds elif display_ax.direction in 'xlr': (_, _), (xmin, xmax), (zmin, zmax) = data_bounds elif display_ax.direction == 'z': (xmin, xmax), (zmin, zmax), (_, _) = data_bounds extent = (xmin, xmax, zmin, zmax) extent_list.append(extent) to_iterate_over = zip(self.display.axes.values(), data_list, extent_list) # Plotting using quiver if self.display._black_bg: color = 'w' else: color = 'k' ims = [] for display_ax, data_2d, extent in to_iterate_over: if data_2d is not None: # get data mask if self.threshold is None: thr = 0 else: thr = self.threshold ** 2 data = (data_2d ** 2).sum(axis=0) not_mask = data > thr # If data_2d is completely masked, then there is nothing to # plot. Hence, continued to loop over. This problem came up # with matplotlib 2.1.0. See issue #9280 in matplotlib. if not_mask.any(): affine_2d = get_transform(extent, data.shape) indices = np.where(not_mask) x, y = coord_transform_2d(indices, affine_2d) if display_ax.direction == 'y': dir_data = (data_2d[0][indices], data_2d[2][indices]) elif display_ax.direction == 'l': dir_data = (-data_2d[1][indices], data_2d[2][indices]) elif display_ax.direction in 'xr': dir_data = (data_2d[1][indices], data_2d[2][indices]) elif display_ax.direction == 'z': dir_data = (data_2d[0][indices], data_2d[1][indices]) im = display_ax.ax.quiver(x, y, dir_data[0], dir_data[1], color=color, scale=self.arrow_scale) else: continue ims.append(im) self._quivers = ims return