Hinweis
Zum Ende springen, um den vollständigen Beispielcode herunterzuladen oder dieses Beispiel über JupyterLite oder Binder in Ihrem Browser auszuführen.
Spektrale Clusterbildung zur Bildsegmentierung#
In diesem Beispiel wird ein Bild mit verbundenen Kreisen generiert und die spektrale Clusterbildung verwendet, um die Kreise zu trennen.
In diesen Einstellungen löst der Ansatz der Spektralen Clusterbildung das Problem, das als ‚normalisierte Graph-Schnitte‘ bekannt ist: Das Bild wird als Graph verbundener Voxel betrachtet, und der Algorithmus der spektralen Clusterbildung besteht darin, Graph-Schnitte zu wählen, die Regionen definieren, während das Verhältnis des Gradienten entlang des Schnitts und das Volumen der Region minimiert wird.
Da der Algorithmus versucht, das Volumen auszugleichen (d. h. die Regionsgrößen auszugleichen), schlägt die Segmentierung fehl, wenn wir Kreise unterschiedlicher Größe nehmen.
Da es keine nützlichen Informationen in der Intensität des Bildes oder seinem Gradienten gibt, entscheiden wir uns, die spektrale Clusterbildung auf einem Graphen durchzuführen, der nur schwach durch den Gradienten informiert ist. Dies kommt der Durchführung einer Voronoi-Partition des Graphen nahe.
Darüber hinaus verwenden wir die Maske der Objekte, um den Graphen auf die Umrisse der Objekte zu beschränken. In diesem Beispiel sind wir daran interessiert, die Objekte voneinander zu trennen und nicht vom Hintergrund.
# Authors: The scikit-learn developers
# SPDX-License-Identifier: BSD-3-Clause
Generieren Sie die Daten#
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
Plotten von vier Kreisen#
img = circle1 + circle2 + circle3 + circle4
# We use a mask that limits to the foreground: the problem that we are
# interested in here is not separating the objects from the background,
# but separating them one from the other.
mask = img.astype(bool)
img = img.astype(float)
img += 1 + 0.2 * np.random.randn(*img.shape)
Wandeln Sie das Bild in einen Graphen um, wobei der Wert des Gradienten an den Kanten liegt.
from sklearn.feature_extraction import image
graph = image.img_to_graph(img, mask=mask)
Nehmen Sie eine abnehmende Funktion des Gradienten, was zu einer Segmentierung führt, die einer Voronoi-Partition nahe kommt
graph.data = np.exp(-graph.data / graph.data.std())
Hier führen wir die spektrale Clusterbildung mit dem arpack-Solver durch, da amg bei diesem Beispiel numerisch instabil ist. Anschließend plotten wir die Ergebnisse.
import matplotlib.pyplot as plt
from sklearn.cluster import spectral_clustering
labels = spectral_clustering(graph, n_clusters=4, 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()

Plotten von zwei Kreisen#
Hier wiederholen wir den obigen Prozess, betrachten aber nur die ersten beiden generierten Kreise. Beachten Sie, dass dies zu einer klareren Trennung zwischen den Kreisen führt, da die Regionsgrößen in diesem Fall leichter auszugleichen sind.
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()

Gesamtlaufzeit des Skripts: (0 Minuten 0,453 Sekunden)
Verwandte Beispiele
Segmentierung des Bildes von griechischen Münzen in Regionen
Kompression Sensing: Tomographie-Rekonstruktion mit L1-Prior (Lasso)