Urmarire Obiecte cu scikit-image — Complete Guide
You will learn how to track objects across multiple frames in biomedical image sequences using scikit-image.
The Problem
Analiza miscarii celulelor sau particulelor in secvente video necesita identificarea acelorasi obiecte de-a lungul cadrelor. Fara trackare corecta, datele de miscare sunt inexacte si inutilizabile.
The Wrong Way
Simpla segmentare frame cu frame fara a lega obiectele intre cadre duce la pierderea identitatii:
from skimage import io, filters, measure
frames = io.ImageCollection('experiment/*.tif')
for i, frame in enumerate(frames):
binary = frame > filters.threshold_otsu(frame)
labels = measure.label(binary)
print(f"Frame {i}: {labels.max()} obiecte")
Ce se intampla: Acelasi obiect primeste un ID diferit in fiecare frame, facand imposibila analiza traiectoriei.
The Right Way
Foloseste trackpy sau implementeaza nearest-neighbor tracking pentru a lega obiectele intre cadre:
import pandas as pd
from skimage import io, filters, measure
from scipy.spatial import distance
frames = io.ImageCollection('experiment/*.tif')
all_objects = []
for i, frame in enumerate(frames):
binary = frame > filters.threshold_otsu(frame)
labels = measure.label(binary)
props = measure.regionprops_table(
labels, properties=('label', 'centroid', 'area')
)
df = pd.DataFrame(props)
df['frame'] = i
all_objects.append(df)
tracks = pd.concat(all_objects, ignore_index=True)
# Leaga obiectele prin distanta minima intre cadre consecutive
Rezultat asteptat: Fiecare obiect primeste un ID unic pe toata durata secventei, permitand trasarea traiectoriei.
Step-by-Step Fix
1. Segmentheaza fiecare cadru
def segment_frame(frame):
binary = frame > filters.threshold_otsu(frame)
cleaned = morphology.remove_small_objects(binary, min_size=20)
return measure.label(cleaned)
2. Extrage centroidii
def extract_centroids(labels, frame_id):
props = measure.regionprops_table(
labels, properties=('label', 'centroid')
)
df = pd.DataFrame(props)
df['frame'] = frame_id
df['particle'] = 0 # se va popula la linkuire
return df
3. Leaga obiectele intre cadre
def link_particles(df, max_distance=50):
particles = []
next_id = 1
for frame_id, group in df.groupby('frame'):
centroids = group[['centroid-0', 'centroid-1']].values
if not particles:
group['particle'] = range(next_id, next_id + len(group))
next_id += len(group)
else:
prev = particles[-1]
prev_cent = prev[['centroid-0', 'centroid-1']].values
dist = distance.cdist(centroids, prev_cent)
# logica de asignare
particles.append(group)
return pd.concat(particles)
Prevention Tips
- Pastreaza parametrii de trackare (max_distance, max_missing) documentati
- Filtreaza obiectele dupa arie pentru a elimina artefactele inainte de trackare
- Foloseste interpolare pentru cadrele in care obiectul nu este detectat
- Verifica vizual traiectoriile rezultate pentru a detecta erori de linkuire
- Salveaza datele brute si parametrii pentru reproductibilitate
Common Mistakes
- Nu leaga obiectele intre cadre -- identitatea se pierde, analiza devine imposibila
- Foloseste distanta prea mare -- leaga obiecte diferite in aceeasi traiectorie
- Ignora obiecte care dispar temporar -- traiectoriile se fragmenteaza
- Nu filtreaza artefactele -- obiecte false genereaza traiectorii inexistente
- Parametrii de trackare sunt alesi arbitrar, nu pe baza datelor
Practice Exercise
Trackeaza 10 particule care se misca Brownian intr-o secventa video. Traseaza traiectoriile si calculeaza viteza medie.
FAQ
Built by the developers of Doda Browser, DodaZIP, and Durga Antivirus Pro. DodaTech tools integrate seamlessly with Python Data Science workflows for enhanced productivity and security.
Built by the developers of DodaTech
Doda Browser, DodaZIP & Durga Antivirus Pro