使用谱聚类分割希腊硬币

Machine LearningMachine LearningBeginner
立即练习

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

💡 本教程由 AI 辅助翻译自英文原版。如需查看原文,您可以 切换至英文原版

简介

在本次实验中,我们将使用谱聚类算法把一张希腊硬币的图像分割成多个部分均匀的区域。谱聚类是一种强大的技术,可用于根据数据集中各特征之间的相似性来识别聚类。在本次实验中,我们将通过基于图像上体素到体素的差异创建一个图,然后将图像分解为多个部分均匀的区域,来使用谱聚类算法分割图像。

虚拟机使用提示

虚拟机启动完成后,点击左上角切换到“笔记本”标签页,以访问 Jupyter Notebook 进行练习。

有时,你可能需要等待几秒钟让 Jupyter Notebook 完成加载。由于 Jupyter Notebook 的限制,操作验证无法自动化。

如果你在学习过程中遇到问题,随时向 Labby 提问。课程结束后提供反馈,我们会及时为你解决问题。


Skills Graph

%%%%{init: {'theme':'neutral'}}%%%% flowchart RL ml(("Machine Learning")) -.-> ml/FrameworkandSoftwareGroup(["Framework and Software"]) ml/FrameworkandSoftwareGroup -.-> ml/sklearn("scikit-learn") subgraph Lab Skills ml/sklearn -.-> lab-49083{{"使用谱聚类分割希腊硬币"}} end

加载并预处理图像

我们将从加载希腊硬币的图像并对其进行预处理开始,以便于后续处理。我们会将图像调整为原始大小的 20%,并在缩小尺寸之前应用高斯滤波器进行平滑处理,以减少混叠伪影。

## 将硬币图像加载为 numpy 数组
orig_coins = coins()

## 将其调整为原始大小的 20% 以加快处理速度
## 在缩小尺寸之前应用高斯滤波器进行平滑处理
## 可减少混叠伪影。
smoothened_coins = gaussian_filter(orig_coins, sigma=2)
rescaled_coins = rescale(smoothened_coins, 0.2, mode="reflect", anti_aliasing=False)

将图像转换为边带有梯度值的图

我们将把图像转换为边带有梯度值的图。β值越小,分割结果对实际图像的依赖性就越低。当β = 1 时,分割结果接近沃罗诺伊图(Voronoi diagram)。

## 将图像转换为边带有梯度值的图。
graph = image.img_to_graph(rescaled_coins)

## 对梯度取一个递减函数:指数函数
beta = 10
eps = 1e-6
graph.data = np.exp(-beta * graph.data / graph.data.std()) + eps

应用谱聚类

我们将使用默认的特征值求解器 eigen_solver='arpack' 来应用谱聚类。可以使用任何已实现的求解器:eigen_solver='arpack''lobpcg''amg'。选择 eigen_solver='amg' 需要一个名为 'pyamg' 的额外软件包。分割的质量和计算速度主要取决于求解器的选择以及容差 eigen_tol 的值。

## 使用默认的特征值求解器 eigen_solver='arpack'应用谱聚类。
## 可以使用任何已实现的求解器:eigen_solver='arpack'、'lobpcg' 或 'amg'。
## 选择 eigen_solver='amg'需要一个名为'pyamg'的额外软件包。
## 分割的质量和计算速度主要取决于求解器的选择以及容差'eigen_tol'的值。
n_regions = 26
n_regions_plus = 3
for assign_labels in ("kmeans", "discretize", "cluster_qr"):
    t0 = time.time()
    labels = spectral_clustering(
        graph,
        n_clusters=(n_regions + n_regions_plus),
        eigen_tol=1e-7,
        assign_labels=assign_labels,
        random_state=42,
    )
    t1 = time.time()
    labels = labels.reshape(rescaled_coins.shape)

可视化分割结果

我们将通过绘制原始图像并叠加分割区域的轮廓来可视化最终得到的区域。

plt.figure(figsize=(5, 5))
plt.imshow(rescaled_coins, cmap=plt.cm.gray)
plt.xticks(())
plt.yticks(())
title = "Spectral clustering: %s, %.2fs" % (assign_labels, (t1 - t0))
print(title)
plt.title(title)
for l in range(n_regions):
    colors = [plt.cm.nipy_spectral((l + 4) / float(n_regions + 4))]
    plt.contour(labels == l, colors=colors)
plt.show()

总结

在本实验中,我们使用谱聚类将希腊硬币的图像分割成多个部分均匀的区域。我们对图像进行了预处理,将其转换为边带有梯度值的图,应用了谱聚类,并可视化了得到的区域。谱聚类是一种强大的技术,可用于根据数据集中各特征之间的相似性来识别聚类。