Source code for neutompy.image.rebin

import numpy as np
import logging

__author__  = "Davide Micieli"
__all__     = ['rebin']


logs = logging.getLogger(__name__)


def rebin3D(arr, binsize, dtype=np.float32):
	"""
	This function rebins a 3D stack of images by averaging.

	Parameters
	----------
	arr :  ndarray
		The 3D stack of images to rebin.

	binsize: tuple
		Tuple defining the bin size for each axis of the 3D array.

	dtype: type, optional
		The type of the rebbined array.

	Returns
	-------
	m : ndarray
		The rebinned stack.
	"""
	arr = arr.astype(np.float32)

	shape = ( arr.shape[0] // binsize[0], binsize[0],
			  arr.shape[1] // binsize[1], binsize[1],
			  arr.shape[2] // binsize[2], binsize[2])

	resto_0 = arr.shape[0]  % binsize[0]
	resto_1 = arr.shape[1]  % binsize[1]
	resto_2 = arr.shape[2]  % binsize[2]

	if  (resto_0 != 0):
		arr = arr[:-resto_0, :, :]

	if(resto_1 != 0):
		arr = arr[:, :-resto_1, :]

	if(resto_2 != 0):
		arr = arr[:, : , :-resto_2]

	return arr.reshape(shape).mean(-1).mean(1).mean(2).astype(dtype)


def rebin2D(arr, binsize, dtype=np.float32):
	"""
	This function rebins a 2D image by averaging.

	Parameters
	----------
	arr :  ndarray
		The 2D image to rebin.

	binsize: tuple
		Tuple defining the bin size for each axis of the image.

	dtype: type, optional
		The type of the rebbined array.

	Returns
	-------
	m : ndarray
		The rebinned image.
	"""

	arr = arr.astype(np.float32)

	shape = ( arr.shape[0] // binsize[0], binsize[0],
		      arr.shape[1] // binsize[1], binsize[1])

	resto_0 = arr.shape[0]  % binsize[0]
	resto_1 = arr.shape[1]  % binsize[1]

	if  (resto_0 != 0):
		arr = arr[:-resto_0, :]

	if(resto_1 != 0):
		arr = arr[:, :-resto_1]

	return arr.reshape(shape).mean(-1).mean(1).astype(dtype)


[docs]def rebin(arr, binsize, dtype=np.float32): """ This function rebins a single 2D image or 3D stack. It reduces the size of an image or stack of images by binning groups of pixels of user-specified sizes. The resulting pixels are computed as average. Parameters ---------- arr : ndarray, 2d or 3d The 2D image or the 3D stack of images to rebin. binsize: tuple Tuple defining the bin size for each axis of the array. E.g.: for 2d array (bin_0, bin_1) for 3d array (bin_0, bin_1, bin_2) dtype: type, optional The type of the returned rebbined array. Returns ------- m : ndarray The rebinned image or stack of images. """ if(arr.ndim==3 and len(binsize)==3): return rebin3D(arr, binsize, dtype) elif (arr.ndim==2 and len(binsize)==2): return rebin2D(arr, binsize, dtype) else: raise ValueError("Array shape or binning shape not valid.")