Ripser.py Learning (7): Lower Star Image Filtrations

1. Einleitung

Dieser Abschnitt präsentiert Low-Star- und Subset-Filterformen auf Bilddaten. Diese Filterform ermöglicht es uns, das lokale Minimum oder lokale Maximum als Anfangszeit und den Sattelpunkt als Todeszeit im 0-dimensionalen Fortsetzungsgraphen zu verwenden.Die folgenden sind einige notwendige Bibliotheken:

import numpy as np
import matplotlib.pyplot as plt
import scipy
import PIL
from scipy import ndimage
from persim import plot_diagrams
from ripser import ripser, lower_star_img

Das Follow-up definiert eine Funktion zum Konstruieren einer 0-dimensionalen Low-Star-Filterform auf dem Bild, die eine spärliche Abstandsmatrix konstruiert, wobei jedes Pixel im Bild ein Scheitelpunkt ist und jeder Scheitelpunkt mit acht räumlichen Nachbarn verbunden ist. Es sei denn, es ist an der Grenze der Fall. Grenzgewichte gelten als das Maximum der beiden Pixelwerte, die sie verbinden (daher der „niedrige Stern“).

Obwohl die Anzahl der Pixel groß ist, liegt die zeitliche Komplexität dieser Funktion linear nahe bei der Anzahl der Pixel, da es nur eine endliche Anzahl von Grenzen auf der Pixelskala gibt und nur eine 0-dimensionale Homotopie berechnet wird.

2 Gaußsche Flecken

Hier ist ein Bild mit Gauss-Blobs: Drei negative Gauß-Kurven sind im Bild mit lokalen Minima bei -3, -2 und -1 platziert:

ts = np.linspace(-1, 1, 100)
x1 = np.exp(-ts**2/(0.1**2))
ts -= 0.4
x2 = np.exp(-ts**2/(0.1**2))
img = -x1[None, :]*x1[:, None] - 2*x1[None, :]*x2[:, None] - 3*x2[None, :]*x2[:, None]
plt.imshow(img)
plt.show()

Die Ausgabe lautet wie folgt:

Holen Sie sich den 0-dimensionalen Fortsetzungsgraphen:

dgm = lower_star_img(img)

plt.figure(figsize=(10, 5))
plt.subplot(121)
plt.imshow(img)
plt.colorbar()
plt.title("Test Image")
plt.subplot(122)
plot_diagrams(dgm)
plt.title("0-D Persistence Diagram")
plt.tight_layout()
plt.show()

Die Ausgabe sieht wie folgt aus:

In diesem Beispiel entsprechen die drei Punkte im Diagramm drei Gaußschen Klecksen, von denen jeder anfänglich auf seinem eigenen Minimum liegt. Zwei von ihnen sterben um 0 herum und treffen andere Klassen am Sattelpunkt, während die eine, die bei -3 beginnt, andere Klassen absorbiert und aufgrund der "Ältestenregel" für immer lebt.

3 Zellbiologische Bilder

Das schematische Bild sieht wie folgt aus:

Wenn das Bild in ein Graustufenbild von [0,255] konvertiert wird, wobei 0 und 255 dunkel bzw. hell entsprechen, können wir sehen, dass die innere Helligkeit der Zelle sehr hoch ist und jede Zelle hat einen bestimmten Wert auf der Grenze treffen sich am Sattelpunkt bei , der näher liegt.

In diesem Fall wird angenommen, dass es innerhalb jeder Zelle eine große Persistenz lokaler Maxima gibt, das heißt, wir führen Superordered Sets oder Ascending Star Filtering durch. Damit der Code für lokale Maxima, aber nicht für lokale Minima funktioniert, kann man einfach die untere Sternfilterfunktion mit dem Negativ des Bildes versehen:

cells_original = (plt.imread("Cells.png") * 255).astype(np.uint8)
cells_grey = np.asarray(PIL.Image.fromarray(cells_original).convert('L'))

plt.subplot(121)
plt.title(cells_original.shape)
plt.imshow(cells_original)
plt.axis('off')
plt.subplot(122)
plt.title(cells_grey.shape)
plt.imshow(cells_grey, cmap='gray')
plt.axis('off')
plt.show()

Die Ausgabe sieht wie folgt aus:

Zeichnen Sie einen 0-dimensionalen Fortsetzungsgraphen:

dgm = lower_star_img(-cells_grey)

plt.figure(figsize=(6, 6))
plot_diagrams(dgm, lifetime=True)
plt.show()

Die Ausgabe sieht wie folgt aus:

Wählen Sie nun einen Persistenzschwellenwert, oberhalb dessen ein Punkt als einer Zelle zugeordnet betrachtet wird.

Ripser.py gibt derzeit keine Darstellungen von 0-dimensionalen Homotopieklassen zurück, kann jedoch einige Problemumgehungen vornehmen, indem jedem Pixel eine kleine Menge gleichmäßigen Rauschens hinzugefügt wird. Dadurch hat jedes Pixel einen eindeutigen Wert, sodass man einfach das Pixel finden kann, dessen Wert gleich der Anfangszeit der gesuchten Klasse ist. Zuvor wird eine lokale Mittelung durchgeführt, um die Darstellung des Maximums näher an die Mitte der Zelle zu bringen:

smoothed = ndimage.uniform_filter(cells_grey.astype(np.float64), size=10)
smoothed += 0.01 * np.random.randn(*smoothed.shape)

plt.figure(figsize=(10, 5))
plt.subplot(121)
im = plt.imshow(cells_grey, cmap='gray')
plt.colorbar(im, fraction=0.03)

plt.subplot(122)
im = plt.imshow(smoothed, cmap='gray')
plt.colorbar(im, fraction=0.03)

plt.tight_layout()
plt.show()

Die Ausgabe sieht wie folgt aus:

Zeichnen Sie den 0D-Fortsetzungsgraphen erneut:

dgm = lower_star_img(-smoothed)
plot_diagrams(dgm, lifetime=True)
plt.show()

Die Ausgabe sieht wie folgt aus:

Wir betrachten einen Cutoff-Punkt und betrachten alle Punkte mit einer Lebensdauer von mehr als 70. Das Folgende zeigt jede im Originalbild hervorgehobene 0D-Pixeldarstellung:

thresh = 70
idxs = np.arange(dgm.shape[0])
idxs = idxs[np.abs(dgm[:, 1] - dgm[:, 0]) > thresh]

plt.figure(figsize=(8, 5))
plt.imshow(cells_original)

X, Y = np.meshgrid(np.arange(smoothed.shape[1]), np.arange(smoothed.shape[0]))
X = X.flatten()
Y = Y.flatten()
for idx in idxs:
    bidx = np.argmin(np.abs(smoothed + dgm[idx, 0]))
    plt.scatter(X[bidx], Y[bidx], 20, 'k')
plt.axis('off')

plt.show()

Die Ausgabe ist wie folgt:

Supongo que te gusta

Origin blog.csdn.net/weixin_44575152/article/details/129697238
Recomendado
Clasificación