Source code for sdt.loc.cg.api
# SPDX-FileCopyrightText: 2020 Lukas Schrangl <lukas.schrangl@tuwien.ac.at>
#
# SPDX-License-Identifier: BSD-3-Clause
"""API for the Crocker-Grier feature finding and fitting algorithm
Provides the standard :py:func:`locate` and :py:func:`batch` functions.
"""
import contextlib
import pandas as pd
from . import algorithm, restrict_roi
from .. import make_batch
from .algorithm import col_nums
[docs]def locate(raw_image, radius, signal_thresh, mass_thresh, bandpass=True,
noise_radius=1):
"""Locate bright, Gaussian-like features in an image
This implements an algorithm proposed by Crocker & Grier [Croc1996]_
and is based on the implementation by the Kilfoil group, see
http://people.umass.edu/kilfoil/tools.php
Parameters
----------
raw_image : array-like
Raw image data
radius : int
This should be a number a little greater than the radius of the
peaks.
signal_thresh : float
A number roughly equal to the value of the brightest pixel (minus the
CCD baseline) in the dimmest peak to be detected. Local maxima with
brightest pixels below this threshold will be discarded.
mass_thresh : float
Use a number roughly equal to the integrated intensity (mass) of the
dimmest peak (minus the CCD baseline) that should be detected. If this
is too low more background will be detected. If it is too high more
peaks will be missed.
Returns
-------
DataFrame(["x", "y", "mass", "size", "ecc"])
x and y are the coordinates of the features. mass is the total
intensity of the feature. size gives the radii of gyration of the
features and ecc the eccentricity. If ``raw_image`` has a `frame_no`
attribute, a ``frame`` column with this information will also be
appended.
Other parameters
----------------
bandpass : bool, optional
Set to True to turn on bandpass filtering, false otherwise. Default is
True.
noise_radius : float, optional
Noise correlation length in pixels. Defaults to 1.
"""
peaks = algorithm.locate(raw_image, radius, signal_thresh, mass_thresh,
bandpass, noise_radius)
df = pd.DataFrame(peaks[:, [col_nums.x, col_nums.y, col_nums.mass,
col_nums.size, col_nums.ecc]],
columns=["x", "y", "mass", "size", "ecc"])
if hasattr(raw_image, "frame_no") and raw_image.frame_no is not None:
df["frame"] = raw_image.frame_no
else:
with contextlib.suppress(AttributeError, KeyError):
# for frames from io.ImageSequence
df["frame"] = raw_image.meta["frame_no"]
return df
# Multihreaded version is slower, use the single threaded one
batch = make_batch.make_batch(locate)
locate_roi = restrict_roi.restrict_roi(locate)
batch_roi = restrict_roi.restrict_roi(batch)