Tracking centroids of segmented cells

[ ]:
%pip install -q --upgrade -r requirements.txt

Importing packages

laptrack.LapTrack is the core object for tracking.

We also import regionprops_table from skimage to calculate the centroids of the segmentation masks.

[1]:
import napari
import numpy as np
import pandas as pd
from matplotlib import pyplot as plt
from skimage.measure import regionprops_table

from laptrack import LapTrack
from laptrack import datasets
from laptrack.data_conversion import convert_split_merge_df_to_napari_graph

Load images and showing in napari

First, we load images to the napari viewer.

[2]:
viewer = napari.Viewer()
images, labels = datasets.cell_segmentation()

viewer.add_image(images)
labels_layer = viewer.add_labels(labels)

Calculating label centroids by regionprops_table

We then calculate the centroids for each labeled region in each frame.

[3]:
regionprops = []
for frame, label in enumerate(labels):
    df = pd.DataFrame(regionprops_table(label, properties=["label", "centroid"]))
    df["frame"] = frame
    regionprops.append(df)
regionprops_df = pd.concat(regionprops)

Tracking centroids by LapTrack

This is where we use LapTrack. We track the centroids of the segmented regions.

[4]:
lt = LapTrack(track_cost_cutoff=15**2, splitting_cost_cutoff=30**2)
track_df, split_df, merge_df = lt.predict_dataframe(
    regionprops_df.copy(),
    coordinate_cols=["centroid-0", "centroid-1"],
    only_coordinate_cols=False,
)
[5]:
track_df = track_df.reset_index()
graph = convert_split_merge_df_to_napari_graph(split_df, merge_df)
viewer.add_tracks(
    track_df[["track_id", "frame", "centroid-0", "centroid-1"]],
    graph=graph,
)
[5]:
<Tracks layer 'Tracks' at 0x7f8ec8bcbc10>

Showing clonal cells by the same colors

To check the result, we show the clonal cell regions by the same colors.

[6]:
new_labels = np.zeros_like(labels)

for i, row in track_df.iterrows():
    frame = int(row["frame"])
    inds = labels[frame] == row["label"]
    new_labels[frame][inds] = int(row["tree_id"]) + 1
viewer.add_labels(new_labels)
labels_layer.visible = False
[7]:
viewer.dims.current_step = (9, 0, 0)
plt.imshow(viewer.screenshot())
plt.xticks([])
plt.yticks([])
[7]:
([], [])
../_images/examples_cell_segmentation_17_1.png
[ ]: