Distanz-Meshes zwischen Nachbarn zeichnen#

Bei der Untersuchung von Nachbarschaftsbeziehungen zwischen Zellen, z. B. um festzustellen, ob Zellen miteinander kommunizieren können, sind ihre Abstände zueinander relevant. Wir können diese mit Hilfe von Distanz-Meshes visualisieren.

import pyclesperanto_prototype as cle
from numpy import random
from skimage.io import imread

Wir verwenden einen Datensatz, der von Heriche et al. veröffentlicht wurde und unter CC BY 4.0 lizenziert ist. Er ist in der Image Data Resource verfügbar.

raw_image = imread("../../data/plate1_1_013 [Well 5, Field 1 (Spot 5)].png")[:,:,0]

nuclei = cle.voronoi_otsu_labeling(raw_image, spot_sigma=15)

cle.imshow(nuclei, labels=True)
../_images/010a418108069486938af96db7cb13e0175786416345198f4e98d9a0df9d68dc.png

Ein Mesh kann beispielsweise zwischen proximalen Nachbarn gezeichnet werden, also Zellkernen, die näher als ein bestimmter maximaler Abstand zueinander sind.

max_distance = 320

proximal_neighbor_mesh = cle.draw_mesh_between_proximal_labels(nuclei, maximum_distance=max_distance)

# Wir machen die Linien für Visualisierungszwecke etwas dicker
proximal_neighbor_mesh = cle.maximum_box(proximal_neighbor_mesh, radius_x=5, radius_y=5)

cle.imshow(proximal_neighbor_mesh)
../_images/50df103449f85897bafbe73a5da4cd240ea98a2693fb91957eac2463972df6be.png
proximal_distance_mesh = cle.draw_distance_mesh_between_proximal_labels(nuclei, maximum_distance=max_distance)

# Wir machen die Linien für Visualisierungszwecke etwas dicker
proximal_distance_mesh = cle.maximum_box(proximal_distance_mesh, radius_x=5, radius_y=5)

cle.imshow(proximal_distance_mesh)
../_images/9cc37b6a72541f57812e709f12bd0eb7712962951d529ffff6ec186167bcd4b9.png

Distanz-Meshes im Detail#

Um ein Distanz-Mesh zu zeichnen, müssen wir eine Distanzmatrix, eine abstrakte Darstellung der Abstände aller Objekte zueinander, mit einer Nachbarschaftsmatrix kombinieren, die darstellt, welche Zellen Nachbarn sind.

Wir beginnen mit der Distanzmatrix.

centroids = cle.centroids_of_background_and_labels(nuclei)

distance_matrix = cle.generate_distance_matrix(centroids, centroids)

# Wir ignorieren Abstände zum Hintergrundobjekt
cle.set_column(distance_matrix, 0, 0)
cle.set_row(distance_matrix, 0, 0)

cle.imshow(distance_matrix, colorbar=True)
../_images/4ef6505fa7103c0ce3ef963872a4cfa70ce0a61e2be9ba2740de96ea5b2488a1.png

Als nächstes sollten wir eine Matrix erstellen, die für jeden Zellkern (von links nach rechts) darstellt, welches seine n nächsten Nachbarn sind.

proximal_neighbor_matrix = cle.generate_proximal_neighbors_matrix(distance_matrix, max_distance=max_distance)

cle.imshow(proximal_neighbor_matrix)
../_images/aa3400095525196f732e9c0138d37eca94384c403d0abba7c23d05a43e33858a.png
distance_touch_matrix = distance_matrix * proximal_neighbor_matrix

cle.imshow(distance_touch_matrix, colorbar=True)
../_images/4f2e5cf35f71c0c5ac19ce6db917791d09aa4f6ae7cd5e1eea472c13e0019fb6.png
distance_mesh1 = cle.touch_matrix_to_mesh(centroids, distance_touch_matrix)

# Wir machen die Linien für Visualisierungszwecke etwas dicker
distance_mesh1 = cle.maximum_box(distance_mesh1, radius_x=5, radius_y=5)

cle.imshow(distance_mesh1, colorbar=True)
../_images/0007349ae6064e58d9a75a1d4fb6c3fc9ecf320ccae3d96c22f8827b22eaca59.png

Um zu überprüfen, ob die Zellkerne von oben immer noch die Zentroide des Meshes sind, fügen wir beide in einem Bild zusammen.

visualization = cle.maximum_images(nuclei > 0, distance_mesh1 > 0)

cle.imshow(visualization)
../_images/cede1d383e9956f09d5814b213496ed85b5ff09e74b232120f6100a363f245fe.png