def load_unit(self, unit_id): """Loads the image data for display.""" # starting fresh for attr in ('current_img_raw', 'current_img', 'saturated_img', 'tails_trimmed_img', 'background_img'): if hasattr(self, attr): delattr(self, attr) t1_mri_path = self.path_getter_inputs(unit_id) self.current_img_raw = read_image(t1_mri_path, error_msg='T1 mri') # crop and rescale self.current_img = scale_0to1( crop_image(self.current_img_raw, self.padding)) self.currently_showing = None skip_subject = False if np.count_nonzero(self.current_img) == 0: skip_subject = True print('MR image is empty!') # # where to save the visualization to # out_vis_path = pjoin(self.out_dir, 'visual_qc_{}_{}'.format(self.vis_type, unit_id)) return skip_subject
def rescale_without_outliers(img, trim_percentile=1, padding=5): """This utility crops the image first, then trims the outliers, and then rescales it [0, 1]""" from mrivis.utils import crop_image return scale_0to1(crop_image(img, padding), exclude_outliers_below=trim_percentile, exclude_outliers_above=trim_percentile)
def attach_image_to_foreground_axes(self, image3d, cmap='gray'): """Attaches a given image to the foreground axes and bring it forth""" image3d = crop_image(image3d, self.padding) image3d = scale_0to1(image3d) slices = pick_slices(image3d, self.views, self.num_slices_per_view) for ax_index, (dim_index, slice_index) in enumerate(slices): slice_data = get_axis(image3d, dim_index, slice_index) self.images_fg[ax_index].set(data=slice_data, cmap=cmap) for ax in self.fg_axes: ax.set(visible=True, zorder=self.layer_order_zoomedin)
def display_unit(self): """Adds slice collage to the given axes""" # crop and rescale img = crop_image(self.current_img, self.padding) img = scale_0to1(img) # adding slices slices = pick_slices(img, self.views, self.num_slices_per_view) for ax_index, (dim_index, slice_index) in enumerate(slices): slice_data = get_axis(img, dim_index, slice_index) self.images[ax_index].set_data(slice_data) # updating histogram self.update_histogram(img)
def collage(img_spec, num_rows=2, num_cols=6, rescale_method='global', cmap='gray', annot=None, padding=5, bkground_thresh=None, output_path=None, figsize=None, **kwargs): "Produces a collage of various slices from different orientations in the given 3D image" num_rows, num_cols, padding = check_params(num_rows, num_cols, padding) img = read_image(img_spec, bkground_thresh=bkground_thresh) img = crop_image(img, padding) img, (min_value, max_value) = check_rescaling_collage(img, rescale_method, return_extrema=True) num_slices_per_view = num_rows * num_cols slices = pick_slices(img, num_slices_per_view) plt.style.use('dark_background') num_axes = 3 if figsize is None: figsize = [3 * num_axes * num_rows, 3 * num_cols] fig, ax = plt.subplots(num_axes * num_rows, num_cols, figsize=figsize) # displaying some annotation text if provided if annot is not None: fig.suptitle(annot, backgroundcolor='black', color='g') display_params = dict(interpolation='none', cmap=cmap, aspect='equal', origin='lower', vmin=min_value, vmax=max_value) ax = ax.flatten() ax_counter = 0 for dim_index in range(3): for slice_num in slices[dim_index]: plt.sca(ax[ax_counter]) ax_counter = ax_counter + 1 slice1 = get_axis(img, dim_index, slice_num) # slice1 = crop_image(slice1, padding) plt.imshow(slice1, **display_params) plt.axis('off') fig.tight_layout() if output_path is not None: output_path = output_path.replace(' ', '_') fig.savefig(output_path + '.png', bbox_inches='tight') # plt.close() return fig