Source code for apstools.utils.image_analysis

"""
Statistical peak analysis functions
+++++++++++++++++++++++++++++++++++++++

Uses *pysumreg* package (https://prjemian.github.io/pysumreg/) to obtain summary
statistics.

.. autosummary::

   ~analyze_1D
   ~analyze_2D
"""

__all__ = """
    analyze_1D
    analyze_2D
""".split()

import logging

import numpy as np
from pysumreg import SummationRegisters

logger = logging.getLogger(__name__)
logger.info(__file__)


[docs]def analyze_1D(y_arr, x_arr=None): """ Measures of 1D data peak center & width. Return result is a dictionary prepared by the ``to_dict(use_registers=True)`` method of the ``pysumreg.SummationRegisters()`` class. Example:: {'mean_x': 2.0, 'mean_y': 7.2, 'stddev_x': 1.5811388300841898, 'stddev_y': 3.3466401061363027, 'slope': 0.0, 'intercept': 7.2, 'correlation': 0.0, 'centroid': 2.0, 'sigma': 1.1547005383792515, 'min_x': 1, 'max_x': 4, 'min_y': 4, 'max_y': 12, 'x_at_max_y': 2, 'n': 5, 'X': 10, 'Y': 36, 'XX': 30, 'XY': 72, 'XXY': 192, 'YY': 304} """ if x_arr is None: x_arr = list(range(len(y_arr))) if len(x_arr) != len(y_arr): raise ValueError("x and y arrays are not of the same length.") regs = SummationRegisters() regs.clear() for u, v in zip(x_arr, y_arr): regs.add(u, v) return regs.to_dict(use_registers=True)
[docs]def analyze_2D(image): """ Analyze 2-D (image) data. Return result is a dictionary with the statistical results for a peak analysis, grouped in pairs (row, column) as it makes sense given ``frame[rows][columns]``. The :math:`x` values are the index number along the respective axis. For this image data:: [ [0, 1, 2, 1, 0], [1, 2, 3, 2, 1], [2, 3, 4, 10, 2], [1, 2, 3, 2, 1], ] This is the analysis:: {'n': (5, 4), 'centroid': (2.1628, 1.814), 'sigma': (1.1192, 0.8695), 'peak_position': (3, 2), 'max_y': 10} """ if not isinstance(image, np.ndarray): image = np.array(image) axis_0 = analyze_1D(image.sum(axis=0)) axis_1 = analyze_1D(image.sum(axis=1)) key_list = "n centroid sigma".split() results = {k: (axis_0[k], axis_1[k]) for k in key_list} k = "x_at_max_y" results["peak_position"] = (axis_0[k], axis_1[k]) results["max_y"] = image[axis_1[k]][axis_0[k]] return results
# ----------------------------------------------------------------------------- # :author: Pete R. Jemian # :email: jemian@anl.gov # :copyright: (c) 2017-2024, UChicago Argonne, LLC # # Distributed under the terms of the Argonne National Laboratory Open Source License. # # The full license is in the file LICENSE.txt, distributed with this software. # -----------------------------------------------------------------------------