Introducción
En este laboratorio, aprenderemos a realizar la segmentación de imágenes utilizando agrupamiento espectral. Generaremos una imagen con múltiples círculos conectados y usaremos el agrupamiento espectral para separar los círculos.
Consejos sobre la VM
Una vez que se haya iniciado la VM, haga clic en la esquina superior izquierda para cambiar a la pestaña Cuaderno y acceder a Jupyter Notebook para practicar.
A veces, es posible que tenga que esperar unos segundos a que Jupyter Notebook termine de cargarse. La validación de las operaciones no se puede automatizar debido a las limitaciones de Jupyter Notebook.
Si tiene problemas durante el aprendizaje, no dude en preguntar a Labby. Deje sus comentarios después de la sesión y lo resolveremos rápidamente para usted.
Generar los datos
Generaremos una imagen con cuatro círculos utilizando numpy. Luego, agregaremos algo de ruido a la imagen y crearemos una máscara para limitar la imagen al primer plano.
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)
Convertir la imagen en un gráfico
Usaremos img_to_graph de sklearn.feature_extraction.image para convertir la imagen en un gráfico. También se calculará el valor del gradiente en los bordes.
from sklearn.feature_extraction import image
graph = image.img_to_graph(img, mask=mask)
Agrupamiento espectral
Usaremos la función spectral_clustering de sklearn.cluster para realizar el agrupamiento espectral. El parámetro n_clusters se establece en 4 para separar los cuatro círculos.
from sklearn.cluster import spectral_clustering
labels = spectral_clustering(graph, n_clusters=4, eigen_solver="arpack")
Graficar los resultados
Graficaremos la imagen original y la imagen segmentada lado a lado utilizando matshow de matplotlib.pyplot.
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()
Graficando dos círculos
Repetiremos el proceso anterior, pero solo consideraremos los primeros dos círculos generados.
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()
Resumen
En este laboratorio, aprendimos cómo realizar la segmentación de imágenes utilizando el agrupamiento espectral. Generamos una imagen con múltiples círculos conectados, convertimos la imagen en un gráfico, realizamos el agrupamiento espectral y graficamos los resultados.