Source code for glmdenoise.utils.make_image_stack
import numpy as np
from math import floor, ceil
[docs]def make_image_stack(m):
"""make image stack from 3D volume
<m> is a 3D matrix. if more than 3D, we reshape to be 3D.
we try to make the imagestack as square as possible
(e.g. for 16 images, we would use [4 4]).
find the minimum possible to fit all the images in.
Args:
m ([3D volume]): this can be a 3D volume of any sort.
Returns:
[2D stack]: 2D stack of slices
"""
m = np.array(m)
bordersize = 1
# calc
nrows, ncols, numim = m.shape
mx = np.nanmax(m.ravel())
# calculate csize
rows = floor(np.sqrt(numim))
cols = ceil(numim / rows)
csize = [rows, cols]
rowstop = rows - 1
# calc
chunksize = csize[0] * csize[1]
numchunks = ceil(numim / chunksize)
# total cols and rows for adding border to slices
tnrows = nrows + bordersize
tncols = ncols + bordersize
# make a zero array of chunksize
# add border
mchunk = np.zeros((tnrows, tncols, chunksize))
mchunk[:, :, :numim] = mx
mchunk[:-1, :-1, :numim] = m
# combine images
flatmap = np.zeros((tnrows * rows, tncols * cols))
ci = 0
ri = 0
for plane in range(chunksize):
flatmap[ri: ri + tnrows, ci: ci + tncols] = mchunk[:, :, plane]
ri += tnrows
# if we have filled rows rows, change column
# and reset r
if plane != 0 and ri == tnrows * rows:
ci += tncols
ri = 0
return flatmap