Nachbargitter in drei Dimensionen#

Die Nachbargitter, mit denen wir in diesem Kapitel gearbeitet haben, funktionieren im Allgemeinen auch in drei Dimensionen. Es ist nur schwieriger, diese zu visualisieren.

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

Die hier verwendeten Bilddaten zeigen einen Ausschnitt eines sich entwickelnden Tribolium castaneum Embryos, der mittels Lichtscheibenmikroskopie von Daniela Vorkel, Myers Labor, MPI-CBG / CSBD Dresden, aufgenommen wurde.

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

raw_image.shape
(100, 256, 256)

Der Einfachheit halber schreiben wir eine kurze Funktion zur Visualisierung unseres Bildstapels in drei Maximalprojektionen aus verschiedenen Perspektiven.

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("Maximale Intensität entlang X")
    axs[1].set_title("Maximale Intensität entlang Y")
    axs[2].set_title("Maximale Intensität entlang Z")

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

Wir können nun Zellkerne in unserem Datensatz segmentieren.

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

Nach der Segmentierung erweitern wir die Beschriftungen ein wenig, damit sie sich berühren.

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

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

Und dann können wir ein (Schwerpunkt-)Distanznetz zwischen sich berührenden Nachbarn visualisieren.

mesh = cle.draw_distance_mesh_between_touching_labels(expanded_nuclei)

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