Einführung
In diesem Lab werden wir lernen, wie wir hierarchische Clusteranalyse verwenden, um ein 2D-Bild zu segmentieren. Hierarchische Clusteranalyse ist ein Clustering-Algorithmus, der ähnliche Datenpunkte zusammen gruppiert. Im Kontext der Bildsegmentierung kann hierarchische Clusteranalyse verwendet werden, um Pixel mit ähnlichen Farbintensitäten zusammen zu gruppieren, was bei der Identifizierung unterschiedlicher Regionen oder Objekte in einem Bild nützlich sein kann.
Wir werden die scikit-learn-Bibliothek in Python verwenden, um hierarchische Clusteranalyse auf einem Bild von Münzen durchzuführen.
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 in 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 beginnen mit der Datengenerierung. Wir werden das coins-Dataset von scikit-image verwenden, das ein 2D-Graustufenbild von Münzen ist. Wir werden das Bild auf 20% seiner ursprünglichen Größe verkleinern, um die Verarbeitung zu beschleunigen.
from skimage.data import coins
import numpy as np
from scipy.ndimage import gaussian_filter
from skimage.transform import rescale
orig_coins = coins()
## Verkleinern Sie es auf 20% seiner ursprünglichen Größe, um die Verarbeitung zu beschleunigen
## Anwenden eines Gaußschen Filters zur Glättung vor der Skalierung nach unten
## reduziert Aliasing-Artifakte.
smoothened_coins = gaussian_filter(orig_coins, sigma=2)
rescaled_coins = rescale(
smoothened_coins,
0.2,
mode="reflect",
anti_aliasing=False,
)
X = np.reshape(rescaled_coins, (-1, 1))
Struktur der Daten definieren
Pixel in einem Bild sind mit ihren Nachbarn verbunden. Um hierarchische Clusteranalyse auf einem Bild durchzuführen, müssen wir die Struktur der Daten definieren. Wir können die grid_to_graph-Funktion von scikit-learn verwenden, um eine Verbindungsmatrix zu erstellen, die die Struktur der Daten definiert.
from sklearn.feature_extraction.image import grid_to_graph
connectivity = grid_to_graph(*rescaled_coins.shape)
Clustering berechnen
Mit den definierten Daten und der Verbindungsmatrix können wir jetzt hierarchisches Clustering durchführen. Wir werden die AgglomerativeClustering-Klasse von scikit-learn verwenden, um das Clustering durchzuführen. Wir werden die Anzahl der Cluster auf 27 setzen, was die Anzahl der Münzen im Bild ist. Wir werden die "ward"-Verknüpfungsmethode verwenden, die die Varianz der Distanzen zwischen den zu fusionierenden Clustern minimiert. Wir werden auch die Verbindungsmatrix übergeben, die wir im Schritt 2 erstellt haben.
from sklearn.cluster import AgglomerativeClustering
import time as time
print("Compute structured hierarchical clustering...")
st = time.time()
n_clusters = 27 ## Anzahl der Regionen
ward = AgglomerativeClustering(
n_clusters=n_clusters, linkage="ward", connectivity=connectivity
)
ward.fit(X)
label = np.reshape(ward.labels_, rescaled_coins.shape)
print(f"Elapsed time: {time.time() - st:.3f}s")
print(f"Number of pixels: {label.size}")
print(f"Number of clusters: {np.unique(label).size}")
Ergebnisse plotten
Schließlich können wir die Ergebnisse auf einem Bild plotten. Wir werden matplotlib verwenden, um das skalierten Bild und die Konturen der Cluster zu plotten. Wir werden durch jeden Cluster iterieren und die Kontur der Pixel in diesem Cluster plotten.
import matplotlib.pyplot as plt
plt.figure(figsize=(5, 5))
plt.imshow(rescaled_coins, cmap=plt.cm.gray)
for l in range(n_clusters):
plt.contour(
label == l,
colors=[
plt.cm.nipy_spectral(l / float(n_clusters)),
],
)
plt.axis("off")
plt.show()
Zusammenfassung
In diesem Lab haben wir gelernt, wie wir hierarchisches Clustering verwenden, um eine 2D-Bild zu segmentieren. Wir haben die Daten generiert, die Struktur der Daten definiert, hierarchisches Clustering durchgeführt und die Ergebnisse auf einem Bild geplottet. Diese Technik kann nützlich sein, um unterschiedliche Regionen oder Objekte in einem Bild zu identifizieren.