Mallas vecinas en tres dimensiones#

Las mallas vecinas con las que trabajamos en este capítulo también funcionan en general en tres dimensiones. Solo es más desafiante visualizarlas.

from skimage.io import imread
import pyclesperanto_prototype as cle
import matplotlib.pyplot as plt

Los datos de imagen que usamos aquí muestran un recorte de un embrión de Tribolium castaneum en desarrollo, fotografiado mediante microscopía de lámina de luz por Daniela Vorkel, laboratorio Myers, MPI-CBG / CSBD Dresden.

raw_image = imread("../../data/Lund_000500_resampled-cropped.tif")

raw_image.shape
(100, 256, 256)

Para facilitar el uso, escribimos una función corta para visualizar nuestra pila de imágenes en tres proyecciones máximas desde diferentes perspectivas.

def orthogonal_show(image, labels=False):

    fig, axs = plt.subplots(1, 3, figsize=(15, 7))

    cle.imshow(cle.maximum_x_projection(image), plot=axs[0], labels=labels)
    cle.imshow(cle.maximum_y_projection(image), plot=axs[1], labels=labels)
    cle.imshow(cle.maximum_z_projection(image), plot=axs[2], labels=labels)
    
    axs[0].set_title("Intensidad máxima a lo largo de X")
    axs[1].set_title("Intensidad máxima a lo largo de Y")
    axs[2].set_title("Intensidad máxima a lo largo de Z")

orthogonal_show(raw_image)
../_images/b30c38082371b1233ce76cfbb27dee1cf2952fc27e8cdae0742bed8a47ec95eb.png

Ahora podemos segmentar los núcleos en nuestro conjunto de datos.

background_subtracted = cle.top_hat_box(raw_image, radius_x=5, radius_y=5, radius_z=5)

nuclei = cle.voronoi_otsu_labeling(background_subtracted)

orthogonal_show(nuclei, labels=True)
../_images/09b7fd4ce227c904cd560e13ba06cd1f7c85ea01da6189764f7f270307ba4d26.png

Después de la segmentación, expandimos un poco las etiquetas para que se toquen.

expanded_nuclei = cle.dilate_labels(nuclei, radius=4)

orthogonal_show(expanded_nuclei, labels=True)
../_images/bb02d3d920d14cc47faf7b78f172a7a46dac5f741ab9f3c0c10aa5ddecbc609d.png

Y luego, podemos visualizar una malla de distancia (centroide) entre vecinos que se tocan.

mesh = cle.draw_distance_mesh_between_touching_labels(expanded_nuclei)

orthogonal_show(mesh)
../_images/a068cfcf93ddeb33777aa30622c4d19788275a8fb685cb27dbd6c40cf5088d0f.png