Введение
В этом лабораторном занятии мы научимся выполнять сегментацию изображений с использованием спектрального кластеризации. Мы сгенерируем изображение с несколькими соединенными кругами и используем спектральное кластерирование для разделения кругов.
Советы по работе с ВМ
После завершения запуска ВМ нажмите в левом верхнем углу, чтобы переключиться на вкладку Ноутбук, чтобы получить доступ к Jupyter Notebook для практики.
Иногда вам может потребоваться подождать несколько секунд, пока Jupyter Notebook не загрузится полностью. Валидация операций не может быть автоматизирована из-за ограничений в Jupyter Notebook.
Если вы сталкиваетесь с проблемами во время обучения, не стесняйтесь обращаться к Labby. Оставьте отзыв после занятия, и мы оперативно решим проблему для вас.
Генерация данных
Мы сгенерируем изображение с четырьмя кругами с использованием numpy. Затем мы добавим некоторый шум к изображению и создадим маску, чтобы ограничить изображение только к переднему плану.
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)
Преобразование изображения в граф
Мы будем использовать img_to_graph из sklearn.feature_extraction.image для преобразования изображения в граф. Также будет вычислено значение градиента на ребрах.
from sklearn.feature_extraction import image
graph = image.img_to_graph(img, mask=mask)
Спектральное кластерирование
Мы будем использовать функцию spectral_clustering из sklearn.cluster для выполнения спектрального кластерирования. Параметр n_clusters установлен в 4, чтобы разделить четыре круга.
from sklearn.cluster import spectral_clustering
labels = spectral_clustering(graph, n_clusters=4, eigen_solver="arpack")
Построение результатов
Мы построим исходное изображение и сегментированное изображение рядом с использованием matshow из 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()
Построение двух кругов
Мы повторим вышеописанный процесс, но будем учитывать только первые два сгенерированных круга.
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()
Резюме
В этом практическом занятии мы узнали, как выполнять сегментацию изображений с использованием спектрального кластерирования. Мы сгенерировали изображение с несколькими соединенными кругами, преобразовали изображение в граф, выполнили спектральное кластерирование и построили результаты.