Einführung
In diesem Lab werden wir lernen, wie man Bildsegmentierung mit Hilfe von spectral clustering durchführt. Wir werden ein Bild mit mehreren verbundenen Kreisen generieren und spectral clustering verwenden, um die Kreise zu trennen.
Tipps für die VM
Nachdem der VM-Start abgeschlossen ist, klicken Sie in der oberen linken Ecke, um zur Registerkarte Notebook zu wechseln und Jupyter Notebook für die Übung zu öffnen.
Manchmal müssen Sie einige Sekunden warten, bis Jupyter Notebook vollständig geladen ist. Die Validierung von Vorgängen kann aufgrund der Einschränkungen von Jupyter Notebook nicht automatisiert werden.
Wenn Sie bei der Lernphase Probleme haben, können Sie Labby gerne fragen. Geben Sie nach der Sitzung Feedback, und wir werden das Problem für Sie prompt beheben.
Daten generieren
Wir werden mit Hilfe von numpy ein Bild mit vier Kreisen generieren. Anschließend werden wir dem Bild etwas Rauschen hinzufügen und eine Maske erstellen, um das Bild auf den Vordergrund zu beschränken.
import numpy as np
l = 100
x, y = np.indices((l, l))
center1 = (28, 24)
center2 = (40, 50)
center3 = (67, 58)
center4 = (24, 70)
radius1, radius2, radius3, radius4 = 16, 14, 15, 14
circle1 = (x - center1[0]) ** 2 + (y - center1[1]) ** 2 < radius1**2
circle2 = (x - center2[0]) ** 2 + (y - center2[1]) ** 2 < radius2**2
circle3 = (x - center3[0]) ** 2 + (y - center3[1]) ** 2 < radius3**2
circle4 = (x - center4[0]) ** 2 + (y - center4[1]) ** 2 < radius4**2
img = circle1 + circle2 + circle3 + circle4
mask = img.astype(bool)
img = img.astype(float)
img += 1 + 0.2 * np.random.randn(*img.shape)
Das Bild in einen Graphen umwandeln
Wir werden img_to_graph aus sklearn.feature_extraction.image verwenden, um das Bild in einen Graphen umzuwandeln. Der Wert des Gradienten an den Kanten wird ebenfalls berechnet.
from sklearn.feature_extraction import image
graph = image.img_to_graph(img, mask=mask)
Spectral Clustering
Wir werden die Funktion spectral_clustering aus sklearn.cluster verwenden, um spectral clustering durchzuführen. Der Parameter n_clusters wird auf 4 gesetzt, um die vier Kreise zu trennen.
from sklearn.cluster import spectral_clustering
labels = spectral_clustering(graph, n_clusters=4, eigen_solver="arpack")
Ergebnisse visualisieren
Wir werden das ursprüngliche Bild und das segmentierte Bild nebeneinander mit Hilfe von matshow aus matplotlib.pyplot plotten.
import matplotlib.pyplot as plt
label_im = np.full(mask.shape, -1.0)
label_im[mask] = labels
fig, axs = plt.subplots(nrows=1, ncols=2, figsize=(10, 5))
axs[0].matshow(img)
axs[1].matshow(label_im)
plt.show()
Zeichnen von zwei Kreisen
Wir werden den obigen Prozess wiederholen, aber nur die ersten zwei generierten Kreise berücksichtigen.
img = circle1 + circle2
mask = img.astype(bool)
img = img.astype(float)
img += 1 + 0.2 * np.random.randn(*img.shape)
graph = image.img_to_graph(img, mask=mask)
graph.data = np.exp(-graph.data / graph.data.std())
labels = spectral_clustering(graph, n_clusters=2, eigen_solver="arpack")
label_im = np.full(mask.shape, -1.0)
label_im[mask] = labels
fig, axs = plt.subplots(nrows=1, ncols=2, figsize=(10, 5))
axs[0].matshow(img)
axs[1].matshow(label_im)
plt.show()
Zusammenfassung
In diesem Lab haben wir gelernt, wie man Bildsegmentierung mit spectral clustering durchführt. Wir haben ein Bild mit mehreren verbundenen Kreisen erzeugt, das Bild in einen Graphen umgewandelt, spectral clustering durchgeführt und die Ergebnisse geplottet.