Source code for tike.align.align
__author__ = "Daniel Ching, Viktor Nikitin"
__copyright__ = "Copyright (c) 2020, UChicago Argonne, LLC."
__docformat__ = 'restructuredtext en'
__all__ = [
"reconstruct",
"simulate",
"invert",
]
import logging
import numpy as np
from tike.operators import Alignment
from tike.align import solvers
logger = logging.getLogger(__name__)
[docs]def simulate(
original,
**kwargs
): # yapf: disable
"""Return original shifted by shift."""
with Alignment() as operator:
for key, value in kwargs.items():
if not isinstance(value, tuple) and np.ndim(value) > 0:
kwargs[key] = operator.asarray(value)
unaligned = operator.fwd(
operator.asarray(original, dtype='complex64'),
**kwargs,
)
assert unaligned.dtype == 'complex64', unaligned.dtype
return operator.asnumpy(unaligned)
[docs]def invert(
original,
**kwargs
): # yapf: disable
"""Return original shifted by shift."""
with Alignment() as operator:
for key, value in kwargs.items():
if not isinstance(value, tuple) and np.ndim(value) > 0:
kwargs[key] = operator.asarray(value)
unaligned = operator.inv(
operator.asarray(original, dtype='complex64'),
**kwargs,
)
assert unaligned.dtype == 'complex64', unaligned.dtype
return operator.asnumpy(unaligned)
[docs]def reconstruct(
original,
unaligned,
algorithm,
num_iter=1, rtol=-1, **kwargs
): # yapf: disable
"""Solve the alignment problem; returning either the original or the shift.
Parameters
----------
unaligned, original: (..., H, W) complex64
The images to be aligned.
rtol : float
Terminate early if the relative decrease of the cost function is
less than this amount.
"""
if algorithm in solvers.__all__:
with Alignment() as operator:
for key, value in kwargs.items():
if not isinstance(value, tuple) and np.ndim(value) > 0:
kwargs[key] = operator.asarray(value)
logger.info("{} on {:,d} - {:,d} by {:,d} images for {:,d} "
"iterations.".format(algorithm, *unaligned.shape,
num_iter))
result = getattr(solvers, algorithm)(
operator,
original=operator.asarray(original, dtype='complex64'),
unaligned=operator.asarray(unaligned, dtype='complex64'),
num_iter=num_iter,
**kwargs,
)
return {k: operator.asnumpy(v) for k, v in result.items()}
else:
raise ValueError(
"The '{}' algorithm is not an available.".format(algorithm))