Source code for ncempy.eval.stack_align
import numpy as np
from ncempy.eval import multicorr
[docs]def stack_align(stack, align_type='static', **kwargs):
""" Align a series of images by correlation using multicorr. All images are aligned to the start image or as
dynamically starting with the start image and then each successive image. keyword arguments are passed to
multicorr. Shifting is done in Fourier space which is very accurate, but wraps edges.
Parameters
----------
stack : ndarray, 3D,
Stack of images to align. Shape [num, Y, X]
align_type: str
static or dynamic alignment. Static aligns all images to the first image. Dynamic aligns
each image to the previous image starting with the first image
Returns
-------
: tuple, aligned stack, shifts
A tuple containing the aligned images as a 3D ndarray of shape
[num, Y, X] and shifts as a 2D ndarray of shape [num, 2]
"""
if align_type != 'static' and align_type != 'dynamic':
raise KeyError('Incorrect align type. Must be static or dynamic')
# Pre-allocate the arrays
aligned = np.zeros_like(stack) # shifted data array
shifts = np.zeros((stack.shape[0], 2)) # the applied shifts
aligned[0, :, :] = stack[0, :, :]
# Align positive angles
ref_fft = np.fft.fft2(stack[0, :, :])
ref_sh = np.zeros((2,))
for ii in range(1, stack.shape[0]):
cur_fft = np.fft.fft2(stack[ii, :, :])
sh = multicorr.multicorr(cur_fft, ref_fft, **kwargs)
sh += ref_sh
image_shifted = np.real(np.fft.ifft2(multicorr.imageShifter(cur_fft, sh)))
aligned[ii, :, :] = image_shifted
shifts[ii, :] = sh
if align_type == 'dynamic':
ref_fft = cur_fft
ref_sh = sh
return aligned, shifts