图像分割的谱聚类算法示例

在本示例中,将生成一个包含相连圆圈的图像,并使用谱聚类算法来分离这些圆圈。谱聚类方法解决了所谓的“归一化图割”问题:将图像视为连接体素的图,谱聚类算法实际上是选择定义区域的图割,同时最小化割沿线的梯度与区域体积的比率。

当算法试图平衡体积(即平衡区域大小)时,如果采用不同大小的圆圈,分割就会失败。此外,由于图像的强度或其梯度中没有有用信息,选择在仅由梯度弱信息的图上执行谱聚类。这接近于执行图的Voronoi划分。

此外,使用对象的掩码来限制图到对象的轮廓。在这个示例中,感兴趣的是将对象相互分离,而不是与背景分离。

生成数据

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)

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

from sklearn.feature_extraction import image graph = image.img_to_graph(img, mask=mask) graph.data = np.exp(-graph.data / graph.data.std())

在这里,执行谱聚类,使用arpack求解器,因为在这个示例中amg在数值上不稳定。然后绘制结果。

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

在上述过程中,重复了上述过程,但只考虑了生成的前两个圆圈。注意,由于区域大小更容易平衡,这将导致圆圈之间的更清晰分离。

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

脚本的总运行时间:(0分钟0.501秒)

可以下载Jupyter笔记本:

下载Python源代码:

相关示例

  • 将希腊硬币的图片分割成区域
  • 压缩感知:具有L1先验的层析重建(Lasso)
  • 缓存最近邻
  • 使用核PCA进行图像去噪
沪ICP备2024098111号-1
上海秋旦网络科技中心:上海市奉贤区金大公路8218号1幢 联系电话:17898875485