Сегментация изображений с использованием иерархической кластеризации

Machine LearningMachine LearningBeginner
Практиковаться сейчас

This tutorial is from open-source community. Access the source code

💡 Этот учебник переведен с английского с помощью ИИ. Чтобы просмотреть оригинал, вы можете перейти на английский оригинал

Введение

В этом лабе мы научимся использовать иерархическое кластеризация для сегментации 2D-изображения. Иерархическая кластеризация - это алгоритм кластеризации, который группирует похожие точки данных вместе. В контексте сегментации изображений иерархическая кластеризация может быть использована для группировки пикселей с похожими интенсивностями цвета, что может быть полезно при идентификации отдельных областей или объектов на изображении.

Мы будем использовать библиотеку scikit-learn на Python для выполнения иерархической кластеризации на изображении монет.

Советы по работе с ВМ

После запуска ВМ кликните в левом верхнем углу, чтобы переключиться на вкладку Ноутбук и получить доступ к Jupyter Notebook для практики.

Иногда вам может потребоваться подождать несколько секунд, пока Jupyter Notebook не загрузится полностью. Валидация операций не может быть автоматизирована из-за ограничений Jupyter Notebook.

Если вы сталкиваетесь с проблемами во время обучения, не стесняйтесь обращаться к Лэби. Оставьте отзыв после занятия, и мы оперативно решим проблему для вас.

Генерация данных

Начнем с генерации данных. Будем использовать датасет coins из scikit-image, который представляет собой 2D-граayscale изображение монет. Изменим размер изображения до 20% от исходного, чтобы ускорить обработку.

from skimage.data import coins
import numpy as np
from scipy.ndimage import gaussian_filter
from skimage.transform import rescale

orig_coins = coins()

## Resize it to 20% of the original size to speed up the processing
## Applying a Gaussian filter for smoothing prior to down-scaling
## reduces aliasing artifacts.

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))

Определение структуры данных

Пиксели на изображении соединены с их соседями. Чтобы выполнить иерархическую кластеризацию на изображении, нам нужно определить структуру данных. Мы можем использовать функцию grid_to_graph из scikit-learn для создания матрицы связности, которая определяет структуру данных.

from sklearn.feature_extraction.image import grid_to_graph

connectivity = grid_to_graph(*rescaled_coins.shape)

Вычисление кластеризации

После определения данных и матрицы связности мы можем теперь выполнить иерархическую кластеризацию. Мы будем использовать класс AgglomerativeClustering из scikit-learn для выполнения кластеризации. Мы установим количество кластеров в 27, что соответствует количеству монет на изображении. Мы будем использовать метод связи "ward", который минимизирует дисперсию расстояний между объединяемыми кластерами. Мы также передадим матрицу связности, которую создали на шаге 2.

from sklearn.cluster import AgglomerativeClustering
import time as time

print("Compute structured hierarchical clustering...")
st = time.time()
n_clusters = 27  ## number of regions
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}")

Построение результатов

Наконец, мы можем построить результаты на изображении. Мы будем использовать matplotlib для построения масштабированного изображения и контуров кластеров. Мы будем перебирать каждый кластер и рисовать контур пикселей в этом кластере.

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()

Резюме

В этом практическом занятии мы узнали, как использовать иерархическую кластеризацию для сегментации 2D-изображения. Мы сгенерировали данные, определили структуру данных, выполнили иерархическую кластеризацию и построили результаты на изображении. Эта техника может быть полезна при идентификации отдельных областей или объектов на изображении.