C# 的计算机视觉应用 - 第四部分
KMeans 聚类

引言
本文介绍计算机视觉中的模式识别。我将讨论一种称为KMeans聚类的聚类算法。请注意,模式识别主要基于统计技术,因此不要惊讶地发现,例如数据挖掘算法,被用于计算机视觉中。实际上,SQL Analysis Services中就有一个KMeans的实现。
那么什么是KMeans?它是一种无监督学习技术。它是无监督的,因为当它开始运行时,它会根据某些标准决定何时停止。它是一种学习技术,因为它会学习数据。KMeans的目的是发现数据中的数据簇。因此,如果在某些数据上运行KMeans,最终会得到“K”个数据簇。这些簇是根据数据的某些共同属性形成的。我们必须预先指定“K”,并为算法提供这些“K”个簇的质心的估计。请注意,提供这两个参数的能力并非总是可行的,这是该算法的缺点 – 在这种情况下,需要使用KMeans的变体而不是这个基本版本。
图像分割
那么KMeans聚类与图像有什么关系呢?它可以找到不同颜色的簇,从而实现图像分割。图像中的数据是像素颜色。我们需要为算法提供簇的数量。这相对容易,因为我们可以通过查看图像来猜测不同颜色的数量。这不必完全准确,但根据簇的数量,我们可能会或可能不会获得良好的分割。在上图中,您可以看到我使用了 3 个簇,这意味着图像被分割成 3 种不同的颜色。好的,现在根据簇的数量,该算法会将相似的颜色组合在一起,直到它找不到任何颜色可以移动到簇中。所以接下来让我们看看算法。
KMeans算法
以下是KMeans算法如何学习数据簇
- 设置簇的数量。
- 设置或随机设置这些簇的质心。
- 对于所有数据
- 查找簇质心与数据之间的距离。
- 将数据移动到距离它最近的簇。
- 计算簇的新质心,因为其数据可能已移动。
- 如果新质心与旧质心不同,则转到步骤 3,否则停止。
就是这样!让我们理解一下:我们知道步骤 1 和 2 是什么意思。对于步骤 2,我从图像中获取前 X 种颜色,并将其值用作质心。换句话说,如果我说我想要 2 个簇,那么如果图像中前 2 种颜色(具有最多像素的颜色)是 RGB:100,200,130 和 40,70,140,那么这些值将成为我的起始 2 个质心。
步骤 3a 是我们将读取图像中的每个像素并找到其与 2 个质心的距离。现在距离是什么?我使用了欧几里德距离,但你可以使用任何距离。但请记住,使用的距离类型会影响分割结果。这是因为使用此距离,我们测量当前像素颜色与簇质心的相似程度。为了强调这一点,我使用了 RGB 和 HSV 颜色模型。为 RGB 和 HSV 使用相同数量的簇将产生不同的分割结果。
步骤 3b 将像素移动到最近的簇。因此,例如,像素 110,215,110 将根据欧几里德距离最接近第一个簇质心,而像素 50,80,160 将最接近第二个簇。
步骤 4 是我们找到簇的新质心的地方。在当前示例中,新质心是:100+110/2,200+215/2,130+110/2 和 40+50/2,70+80/2,140+160/2。是的,新质心是通过平均值找到的。
步骤 5 是收敛性检查。如果新质心与旧质心相同,那么这意味着质心内的数据没有移动,并且簇已稳定!
Using the Code
该代码非常简单,应该易于使用
- 步骤 1:加载图像 - “加载图像”按钮。
- 步骤 2:设置簇的数量。
- 步骤 3:选择颜色模型。
- 步骤 4:单击“启动 KMeans”按钮以运行该算法。
更改簇的数量和颜色模型,以查看对分割的影响。
关注点
分割图像中最终颜色的值来自簇质心,可能不一定反映原始图像中的颜色。您将在分割图像中看到“K”种不同的颜色。
历史
- 2009 年 8 月 11 日:1.0 版