Source code for nanslice.slice_func

#!/usr/bin/env python
"""slice_func.py

Functions for manipulating 'slices'/images (or (X, Y, 3) arrays)
"""

import numpy as np
import matplotlib as mpl
import scipy.ndimage.filters as filters

[docs]def colorize(data, cmap, clims=None): """ Apply a colormap to grayscale data. Takes an (X, Y) array and returns an (X, Y, 3) array Parameters: - data -- The 2D scalar (X, Y) array to colorize - cmap -- Any valid matplotlib colormap or colormap name - clims -- The limits for the colormap """ if clims is None: norm = None else: norm = mpl.colors.Normalize(vmin=clims[0], vmax=clims[1]) cmap = mpl.cm.get_cmap(cmap) smap = mpl.cm.ScalarMappable(norm=norm, cmap=cmap) return smap.to_rgba(data, alpha=1, bytes=False)[:, :, 0:3]
[docs]def scale_clip(data, lims): """ Scale an image to fill the range 0-1 and clip values that fall outside that range Parameters: - data -- The image data array - lims -- The limits to scale betwee """ return np.clip((data - lims[0]) / (lims[1] - lims[0]), 0, 1)
[docs]def blend(img_under, img_over, img_alpha): """ Blend together two images using an alpha channel image Parameters: - img_under -- The base image (underneath the overlay) - img_over -- The overlay image - img_alpha -- Transparency/alpha value to use when blending """ return img_under*(1 - img_alpha[:, :, None]) + img_over*img_alpha[:, :, None]
[docs]def mask(img, img_mask, back=np.array((0, 0, 0))): """ Mask out sections of one image using another Parameters: - img -- The image to be masked - img_mask -- The mask image - back -- Background value """ if img_mask is None: return img if back.ndim == 1: masked = np.where(img_mask[:, :, np.newaxis], img, back[np.newaxis, np.newaxis, :]) elif back.ndim == 2: masked = np.where(img_mask[:, :, np.newaxis], img, back[:, :, np.newaxis]) elif back.ndim == 3: masked = np.where(img_mask[:, :, np.newaxis], img, back) else: raise Exception('Masking requires a 1, 2, or 3 dimensional array as the background') return masked
[docs]def blur(img, sigma=1): """ Blur an image with a Gaussian kernel Parameters: - img -- The image to blur - sigma -- The FWHM of the Gaussian kernel, in voxels """ return filters.gaussian_filter(img, sigma)
[docs]def checkerboard(img1, img2, square_size=16): """Combine two images in a checkerboard pattern, useful for checking image registration quality. Idea stolen from @ramaana_ on Twitter""" if (img1.shape != img2.shape): raise Exception('Image shape do not match:' + str(img1.shape) + ' vs:' + str(img2.shape)) shape = img1.shape img3 = np.zeros_like(img1) from1 = True row = 0 row_sz = square_size while row < shape[0]: col = 0 col_sz = square_size while col < shape[1]: if from1: img3[row:row+row_sz, col:col+col_sz, :] = img1[row:row+row_sz, col:col+col_sz, :] else: img3[row:row+row_sz, col:col+col_sz, :] = img2[row:row+row_sz, col:col+col_sz, :] col = col + col_sz if (col + col_sz) > shape[1]: col_sz = shape[1] - col from1 = not from1 row = row + row_sz if (row + row_sz) > shape[0]: row_sz = shape[0] - row from1 = not from1 return img3