Background
Cell morphology is an emerging field of biological research that examines the shape, size, and internal structure of cells to describe their state and the processes occurring within them. Today, more and more scientist across the world are investigating visible cellular transformations to predict cellular phenotypes. This research has significant practical implications: understanding specific cellular features characteristic of certain diseases, such as cancer, could lead to new approaches for early detection and classification.
In this work, we will explore aspects of cell motility by analyzing the changing shapes of migrating cells. As a cell moves through space, it reorganizes its membrane, cytosol, and cytoskeletal structures (Mogilner and Oster 1996). According to current understanding, actin polymerization causes protrusions at the leading edge of a cell, forming specific structures known as lamellipodia and filopodia. Elongation of cells in the direction of movement is also reported. These changes can be observed during experiments.
Goals
Our goal is to perform a differential geometry analysis of cellular shape curves to explore the correlation between shape differences and spatial displacement. Using the Riemann Elastic Metric(Li et al. 2023):
\[ g_c^{a, b}(h, k) = a^2 \int_{[0,1]} \langle D_s h, N \rangle \langle D_s k, N \rangle \, ds + b^2 \int_{[0,1]} \langle D_s h, T \rangle \langle D_s k, T \rangle \, ds \]
we can estimate the geodesic distance between two cellular boundary curves to mathematically describe how the cell shape changes over time. To implement this algorithm, we will use the Python Geomstats package.
Dataset
This dataset contains real cell contours obtained via fluorescent microscopy in Professor Prasad’s lab, segmented by Clément Soubrier.
204 directories:
Each directory is namedcell_*
, representing an individual cell.Frames:
Subdirectories inside each cell are namedframe_*
, capturing different time points for that cell.
NumPy Array Objects in Each Frame
- centroid.npy: Stores the coordinates of the cell’s centroid.
- outline.npy: Contains segmented points as Cartesian coordinates.
- time.npy: Timestamp of the frame.
Structure
├── cell_i
│ ├── frame_j
│ │ ├── centroid.npy
│ │ ├── outline.npy
│ │ └── time.npy
│ ├── frame_k
│ │ ├── centroid.npy
│ │ ├── outline.npy
│ │ └── time.npy
│ └── ...
├── cell_l
│ ├── frame_m
│ │ ├── centroid.npy
│ │ ├── outline.npy
│ │ └── time.npy
│ └── ...
└── ...
Single cell dynamics
import numpy as np
import matplotlib.pyplot as plt
import os
= plt.subplots(figsize=(10, 10), layout='constrained')
fig, ax
= 15
N
= sum(os.path.isdir(os.path.join(f"cells/cell_{N}", entry)) for entry in os.listdir(f"cells/cell_{N}"))
number_of_frames = plt.cm.tab20(np.linspace(0, 1, number_of_frames))
colors for i in range(1,number_of_frames+1):
= np.load(f'cells/cell_{N}/frame_{i}/time.npy')
time = np.load(f'cells/cell_{N}/frame_{i}/outline.npy')
border = np.load(f'cells/cell_{N}/frame_{i}/centroid.npy')
centroid
= colors[i - 1]
color
0], border[:, 1], label=time, color=color)
ax.plot(border[:, 0], centroid[1], color=color)
ax.scatter(centroid[
plt.legend()
f"single_cell_{N}.png", dpi=300, bbox_inches='tight') plt.savefig(