Bordes celulares internos y externos#

Al estudiar tejidos, organismos y organoides, a menudo la posición y orientación de la célula y sus membranas dentro del tejido es relevante. Por ejemplo, diferenciamos los lados apicales (en un ápice, en el extremo, exterior) y basales (en la base, interior) de las células dentro del tejido. Partiendo de una imagen de etiquetas de segmentación celular, podemos identificar píxeles que se encuentran fuera o dentro de una estructura formada por células. En el siguiente ejemplo, trabajamos con una imagen sintética bidimensional de algunas células formando un organoide. Las mismas funciones también funcionarán en 3D.

import numpy as np
import pyclesperanto_prototype as cle

Primero, construimos nuestro conjunto de datos sintético. Está compuesto por 6 centros celulares que dilatamos para formar un organoide.

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)

Estas son nuestras células:

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

Y este es el organoide:

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

Ahora identificamos los píxeles que se encuentran en los bordes de las células.

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

Podemos hacer exactamente lo mismo con el organoide para identificar los píxeles en su superficie.

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

Al enmascarar los bordes celulares con el borde del organoide - técnicamente es una multiplicación píxel por píxel - podemos identificar los bordes externos.

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 restamos los bordes externos de todos los bordes celulares, obtenemos los bordes internos

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

Al procesar estas imágenes de etiquetas, ten cuidado, porque estas imágenes pueden no estar etiquetadas secuencialmente. Hay bibliotecas y funciones que pueden tener problemas con este tipo de imágenes de etiquetas (por ejemplo, cle.statistics_of_labelled_pixels()). Puedes imprimir qué etiquetas existen en una imagen de etiquetas usando np.unique() y podrías hacer que las imágenes de etiquetas sean secuenciales usando 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)