Source code for ddd_pylib.tracking._objects_tracking_operator
from ddd_pylib._base import ImageOperator
import pandas as pd
import xarray as xr
import numpy as np
from._tracking_base import TrackingBase
from ddd_pylib.labels_manip import LabelsToPointsOperator
from ._points_tracking_operator import PointsTrackingOperator
[docs]
class ObjectsTrackingOperator(TrackingBase, ImageOperator):
"""
This operator performs tracking of nD+t labeled objects.
It accepts an image with labeled objects and creates a new identical image with consistent labels
across time points, based on the tracking strategy provided.
This operator is just a wrapper, you need to provide a tracking strategy to use it.
For now, the only tracking strategy available is the TrackpyStrategy, which uses the trackpy library to perform tracking of points.
Example:
.. literalinclude:: /_examples/objects_tracking_operator.py
:language: python
"""
def __init__(self):
super().__init__()
def _applyToFrame(self, frameData, t, nT):
raise RuntimeError("This operator does not support frame-wise processing. Use the 'linkTracks' method instead.")
[docs]
def getPrefix(self) -> str:
return "Tracked-"
[docs]
def relabelWithTracks(self, labels: xr.DataArray, linked_df: pd.DataFrame) -> xr.DataArray:
if (linked_df is None) or ('track_id' not in linked_df.columns) or ('original label' not in linked_df.columns):
raise ValueError("Linked DataFrame must contain 'track_id' and 'original label' columns.")
out = []
for t, g in linked_df.groupby("T"):
frame = labels.isel(T=t)
lab = frame.values
orig = g["original label"].astype(int).values
track = g["track_id"].astype(int).values
lut = np.zeros(lab.max() + 1, dtype=np.uint16)
lut[orig[orig != 0]] = track[orig != 0] # skip orig_label 0
tmp = frame.copy()
tmp.values = lut[lab]
out.append(tmp)
res = xr.concat(out, dim="T")
return res.transpose(*labels.dims)
def _run(self):
im = self.getMainImage()
op = LabelsToPointsOperator()
op.setMainImage(im)
yield from op._run()
df = op.getResult()
s = self.getStrategy()
op = PointsTrackingOperator()
op.setCalibration(im.attrs)
op.setMainDataFrame(df)
op.setStrategy(s)
yield from op._run()
linked_df = op.getResult()
self._result = self.relabelWithTracks(im, linked_df)
self._result.name = self.makeResultName()
yield 0