Benachbarte Zellen zählen#

In diesem Notebook visualisieren wir, welche Zellen in einem Gewebe benachbart sind, indem wir ein Netz zeichnen. Darüber hinaus können wir die Intensität des Netzes so ändern, dass sie dem Abstand zwischen den Schwerpunkten der Zellen entspricht.

import pyclesperanto_prototype as cle
import numpy as np
import pandas as pd

Testdaten#

Lassen Sie uns eine gewebeähnliche Struktur erzeugen, die aus Zellen besteht, die typischerweise etwa 6 Nachbarn haben.

cells = cle.artificial_tissue_2d(
    delta_x=48, 
    delta_y=32, 
    random_sigma_x=7, 
    random_sigma_y=7, 
    width=250, 
    height=250)

cle.imshow(cells, labels=True)
../_images/a239d30a5f638c6d12d046b9a4753ec2bb40d0b9731c9978630416c34e95cb81.png

Netz zwischen benachbarten Zellen#

Bevor wir Nachbarn zählen, sollten wir die Nachbarschaftsbeziehungen visualisieren. Wir können dies tun, indem wir ein Netz zwischen den Schwerpunkten benachbarter Zellen zeichnen.

mesh = cle.draw_mesh_between_touching_labels(cells)

cle.imshow(mesh)
../_images/73eb44d8f84fd09a8bea5023ec835deda60879a71faccce7e1cfa0b327748bad.png

Wir können auch beide Visualisierungen in einem Bild kombinieren. Beachten Sie, dass diese Bilder nicht für weitere quantitative Analysen verwendet werden sollten. Sie dienen nur der Visualisierung.

Schwerpunktverbindungen und Zellgrenzen#

Eine gängige Methode zur Visualisierung von Geweben in diesem Zusammenhang besteht darin, Zellgrenzen und das Schwerpunktnetz in verschiedenen Farben zu zeichnen.

visualization = mesh * 2 + cle.detect_label_edges(cells)

cle.imshow(visualization, color_map='jet')
../_images/06b49f4a39272a25bef41589fbe180a68febfa282f5fc85afccd2680da88a553.png

Analyse und Visualisierung der Anzahl benachbarter Zellen#

Wir können auch die benachbarten Zellen zählen und das Ergebnis als parametrisches Bild in Farben visualisieren.

neighbor_count_image = cle.touching_neighbor_count_map(cells)

cle.imshow(neighbor_count_image, color_map='jet', colorbar=True, min_display_intensity=0)
../_images/d25f8180795fcae6816e5176e9d82106bfe9bf4f8f4698be1faae724792c27e6.png

Beachten Sie, dass die Zahlen entlang des Bildrandes möglicherweise nicht genau sind. Daher sollten wir die entsprechenden Zellen von der weiteren Analyse ausschließen.

cells_ex_border = cle.exclude_labels_on_edges(cells)

cle.imshow(cells_ex_border, labels=True)
../_images/2661182fc554bd374db54a176ad01c6affed0f2d22399fe67678a21a9c723517.png

Nach der Korrektur des Labelbildes können wir auch das parametrische Bild korrigieren.

neighbor_count_image_ex_border = neighbor_count_image * (cells_ex_border != 0)

cle.imshow(neighbor_count_image_ex_border, color_map='jet', colorbar=True, min_display_intensity=0)
../_images/059356bb30ff5d2327058e3058156e4dd3bf37bb48fc7f3edb81e2803bdd131e.png

Jetzt können wir die Anzahl der Nachbarn messen. Wir können entweder einfach diese Zahlen lesen und sie in eine Liste einfügen …

cle.read_intensities_from_map(cells_ex_border, neighbor_count_image_ex_border)
cl.Array([[0., 5., 6., 7., 6., 6., 7., 6., 6., 5., 5., 6., 6., 7., 6., 6.,
        6., 6., 6., 6., 6.]], dtype=float32)

… oder wir können diese Werte zusammen mit allen anderen Statistiken lesen und sie in einen pandas DataFrame einfügen.

statistics = cle.statistics_of_labelled_pixels(neighbor_count_image_ex_border, cells_ex_border)

table = pd.DataFrame(statistics)

# Spalte umbenennen
table = table.rename(columns={"mean_intensity": "number_of_neighbors"})

# Nur eine Teilmenge aller Spalten herausfiltern; nur das, was uns interessiert
table = table[["label", "number_of_neighbors", "centroid_x", "centroid_y"]]

table
label number_of_neighbors centroid_x centroid_y
0 1 5.0 74.592697 23.731028
1 2 6.0 173.741379 35.582230
2 3 7.0 49.460915 51.928082
3 4 6.0 91.783768 52.666199
4 5 6.0 142.728210 62.962471
5 6 7.0 189.973206 68.526794
6 7 6.0 73.699181 88.797356
7 8 6.0 115.321083 90.665649
8 9 5.0 163.097733 99.824242
9 10 5.0 58.206852 122.341309
10 11 6.0 98.847565 134.280228
11 12 6.0 147.731705 127.326218
12 13 7.0 200.522903 112.817368
13 14 6.0 67.880905 162.991592
14 15 6.0 122.943306 157.515717
15 16 6.0 171.010025 153.333328
16 17 6.0 43.426266 189.492981
17 18 6.0 96.272728 192.326477
18 19 6.0 140.815964 194.446030
19 20 6.0 193.817596 193.019318

Übung#

Analysieren Sie ein größeres Sichtfeld mit mehr Zellen und variieren Sie die Parameter random_sigma_x und random_sigma_y der Funktion artificial_tissue_2d. Verwenden Sie eine Karte der Berührungsnachbarnzahl, um die Anzahl der sich berührenden Nachbarn vor und nach der Anwendung eines Medianfilters auf die Karte zu zählen.