Bordures cellulaires internes et externes#

Lors de l’étude des tissus, organismes et organoïdes, la position et l’orientation de la cellule et de ses membranes au sein du tissu sont souvent pertinentes. Par exemple, nous différencions les côtés apicaux (à l’apex, à l’extrémité, extérieur) et basaux (à la base, intérieur) des cellules dans le tissu. À partir d’une image d’étiquettes de segmentation cellulaire, nous pouvons identifier les pixels qui se trouvent à l’extérieur ou à l’intérieur d’une structure composée de cellules. Dans l’exemple suivant, nous travaillons avec une image synthétique bidimensionnelle de quelques cellules formant un organoïde. Les mêmes fonctions fonctionneront également en 3D.

import numpy as np
import pyclesperanto_prototype as cle

Tout d’abord, nous construisons notre ensemble de données synthétiques. Il est composé de 6 centres cellulaires que nous avons dilatés pour former un organoïde.

points = np.asarray([
    [50, 50],
    [60, 60],
    [25, 40],
    [70, 30],
    [35, 65],
    [50, 25]
]).T
image = np.zeros((100, 100))
spots = cle.pointlist_to_labelled_spots(points, image)
cells = cle.dilate_labels(spots, radius=15)
spots.shape
(100, 100)

Voici nos cellules :

cells
cle._ image
shape(100, 100)
dtypeuint32
size39.1 kB
min0.0
max6.0

Et voici l’organoïde :

organoid = cells > 0
organoid
cle._ image
shape(100, 100)
dtypeuint8
size9.8 kB
min0.0
max1.0

Nous identifions maintenant les pixels qui se trouvent sur les bordures des cellules.

cell_borders = cle.reduce_labels_to_label_edges(cells)
cell_borders
cle._ image
shape(100, 100)
dtypeuint32
size39.1 kB
min0.0
max6.0

Nous pouvons faire exactement la même chose avec l’organoïde pour identifier les pixels à sa surface.

organoid_border = cle.reduce_labels_to_label_edges(organoid)
organoid_border
cle._ image
shape(100, 100)
dtypeuint32
size39.1 kB
min0.0
max1.0

En masquant les bordures cellulaires avec la bordure de l’organoïde - techniquement, c’est une multiplication pixel par pixel - nous pouvons identifier les bordures extérieures.

outer_borders = cle.mask(cell_borders, organoid_border).astype(np.uint32)
outer_borders
cle._ image
shape(100, 100)
dtypeuint32
size39.1 kB
min0.0
max6.0

Si nous soustrayons les bordures extérieures de toutes les bordures cellulaires, nous obtenons les bordures intérieures

inner_borders = (cell_borders - outer_borders).astype(np.uint32)
inner_borders
cle._ image
shape(100, 100)
dtypeuint32
size39.1 kB
min0.0
max6.0

Lors du post-traitement de ces images d’étiquettes, soyez un peu prudent, car ces images peuvent ne pas être étiquetées séquentiellement. Il existe des bibliothèques et des fonctions qui peuvent avoir des problèmes avec ce type d’images d’étiquettes (par exemple, cle.statistics_of_labelled_pixels()). Vous pouvez afficher les étiquettes existantes dans une image d’étiquettes en utilisant np.unique() et vous pourriez rendre les images d’étiquettes séquentielles en utilisant cle.relabel_sequential().

np.unique(outer_borders)
array([0, 2, 3, 4, 5, 6], dtype=uint32)
np.unique(inner_borders)
array([0, 1, 2, 3, 4, 5, 6], dtype=uint32)