计算机视觉基础知识(九)--图像聚类算法

本文详细介绍了分类与聚类的基本概念,重点探讨了K-means聚类算法、层次聚类(包括凝聚型层次聚类)以及密度聚类(如DBSCAN)的方法和特点。同时,文章提到了聚类在图像处理中的应用及其优缺点。
摘要由CSDN通过智能技术生成

1.分类与聚类 

分类

  • 从特定的数据中挖掘模式,给出判断的过程

分类学习的主要过程

  1. 训练数据集存在一个类标记号;
  2. 判断其是正向数据集,还是负向数据集;
  3. 对数据集进行学习训练,并构建一个训练模型;
  4. 通过该模型对数据集进行预测,并计算结果的性能;

聚类概述

  • 目的是把数据分开;
  • 事先不知到如何去分;完全由算法来判断数据之间的相似性;
  • 相似的数据放到一起;
  • 在聚类的结论出来之前,完全不知到每一类的特点;
  • 对聚类的结果需要由人的经验来分析,各类的特点;
  • 聚类的思想是“物以类聚”;
  • 分类是通过标签来训练得到一个模型;
  • 再对新数据进行预测;
  • 分类训练的数据具有标签;

 聚类

  • 广义上,聚类是将数据中在某些方面的相似的数据成员集中在一起;
  • 一个聚类是一些数据实例的集合;
  • 处于相同聚类中的数据元素彼此相似;
  • 处于不同聚类中的元素彼此不同;
  • 聚类中没有表示类别的分类或分组信息;
  • 这些数据都没有标签;
  • 聚类通常被归为无监督学习(Unsupervised Learning);

聚类算法分类

  1. 原型聚类:K均值聚类算法
  2. 层次聚类
  3. 密度聚类

2.K-means聚类

  • 最常用的聚类算法;
  • 起源于信号处理;
  • 目标是将数据点划分为k个类簇;
  • 是一种原型聚类算法;

K-means算法优点

  • 简单,便于理解;
  • 运算速度快;

K-means算法缺点:

  • 要在聚类之前指定聚集的类簇数量;

K-means聚类算法的流程

  1. 确定k值,即将数据集聚成k个类簇或者小组;
  2. 从数据集中随机选择k个数据点作为质心(centroid)或数据中心;
  3. 分别计算每个数据点到每个质心的距离,将每个点划分到最近质心的小组;
  4. 当每个质心都聚集了一些点后,重新定义算法选择新的质心;
  5. 对每个簇,计算均值,即可得到k个新的质点;
  6. 迭代执行第3步到第5步,直到迭代终止条件满足为止(聚类结果不在变化);

k-means聚类与图像处理

  • 图像处理中,通过k-means可以实现:
  • 图像分割:
  • 通过k-means可以将像素点聚类成k个簇;
  • 使用每个簇内的质心点来替换簇内所有像素点;
  • 在不改变分辨率的情况下,量化压缩图像颜色;
  • 实现图像颜色层级分割;
  • 图像聚类;
  • 图像识别;

k-means聚类与图像处理优点:

  1. 是解决聚类问题的一种经典算法,简单、快速;
  2. 对大数据集,该算法效率较高;
  3. 结果簇密集时,效果较好;

k-means聚类与图像处理缺点:

  1. 必须事先给出k(要生成的簇的数目);
  2. 对噪声和孤立点数据敏感;

3.层次聚类

  • 一种直观的算法
  • 一层一层的进行聚类;

层次法(Hierachical methods)

  • 先计算样本之间的距离;
  • 每次将距离最近的点合并到同一个类;
  • 计算类与类之间的距离;
  • 将距离最近的类合并为一个大类;
  • 不停的合并,直到合成了一个类;

类间距离的计算方法

  • 最短距离法
  • 最长距离法
  • 中间距离法
  • 类平均法;

层次聚类算法的分类:

根据层次分解的顺序分为:

  • 自下底向上:凝聚的层次聚类算法(agglomerative or bottom-up)
  • 自上向下:分裂的层次聚类算法(divisive or top-down)

凝聚层次聚类的步骤

策略

  • 先将每个对象作为一个簇;
  • 合并这些原子簇为越来越大的簇;
  • 直到所有对象都在一个簇中;
  • 或者某个终结条件被满足;

概述

  • 绝大多数层次聚类属于凝聚型层次聚类;
  • 只在簇间相似性的定义上不同;

采用最小距离的凝聚层次聚类的算法流程:

  1. 将每个对象作为一类,计算两两之间的最小距离;
  2. 将距离最小的两个类合并成一个新类;
  3. 重新计算新类与所有类之间的距离;
  4. 重复2和3,直到所有的类最后合并成一类;

凝聚型层次聚类算法的特点

  • 没有类似k-means的全局目标函数;
  • 没有局部极小问题
  • 或者没有很难选择初始点的问题;
  • 合并的操作是单向的,一旦合并不能撤销;
  • 计算存储的代价昂贵;

层次聚类的优缺点

优点

  1. 距离和规则的相似度容易定义,限制少
  2. 不需要预先制定聚类数量;
  3. 可以发现类的层次关系;

缺点:

  1. 计算复杂度太高;
  2. 算法可能聚类成链状;

K-means 与层次聚类

  • 每一中聚类都有其特定的数据结构
  • 服从高斯分布的数据用k-means进行聚类效果较好;
  • 类别之间存在层结构的数据,层次聚类效果较好;

4.密度聚类 DBSCAN

两个参数

  • \xi

  • minPts(形成高密度区域所需要的最少点数)

算法的策略

  • 由一个任意未被访问的点开始;
  • 探索这个点的 \xi 邻域;
  • 如果该 \xi 邻域内有足够多的点;
  • 建立一个新的聚类;
  • 否则,该点被标为杂音;
  • 该杂音点之后可能被发现在其他的 \xi 邻域内;
  • 而该 \xi 邻域可能有足够多的点;
  • 那么该点取消杂音标签,加入该聚类;

优缺点

优点

  • 对噪声不敏感

缺点

  • 聚类的结果与参数关系较大;

5.谱聚类

  1. 根据数据构造一个图结构(graph);
  2. graph的每一个节点对应一个数据点;
  3. 将相似的点连接起来;
  4. 边的权重用于表示数据之间的相似度;
  5. 把该graph用邻接矩阵的形式表示出来,记为w;
  6. 把w的每一列元素加起来得到N个数;
  7. 把他们放在对角线上(其他地方都是零);
  8. 组成一个N*N的矩阵,记为D,并令L=D-W;
  9. 求出L的前k个特征值,以及对应的特征向量;
  10. 把这k个特征(列)向量排列在一起,组成一个N*K的矩阵;
  11. 将其中的每一行看做k维空间中的一个向量;
  12. 使用K-means算法进行聚类;
  13. 聚类的结果中每一行所属的类别就是原graph中的节点(也就是最初的N个数据点)分别所属的类别。

谱聚类的过程

  1. 构图,将采样点数据构造成一张网图;
  2. 切图,将网图按切边规则,切分成不同的图;
  3. 不同的子图就是聚类的结果;

### 回答1: 为了实现Kmeans图像聚类,需要先将图像转换成一维向量,然后运用Kmeans算法对向量进行聚类。常用的聚类特征包括像素的颜色和亮度等。同时,聚类结果可以通过可视化方式呈现,例如将聚类结果绘制成不同颜色的簇中心点,或通过将图像划分成不同的分割区域来显示聚类结果。 ### 回答2: kmeans算法是一种常见的聚类算法,在机器学习和数据挖掘领域得到广泛应用。而Python语言由于其简单易学、开放源代码等优点,已经成为数据科学家的首选编程语言。Python语言中的scikit-learn库中提供了KMeans类,可以很方便地实现kmeans算法。 在使用Python实现kmeans图片聚类时,首先需要读入图片,将图片数据转化为二维向量。由于KMeans算法需要对输入数据进行标准化处理,因此需要对每个像素点的RGB值进行归一化处理。接下来,使用sklearn.cluster库中的KMeans类可以轻松地进行聚类操作。并且,该库中的KMeans类还支持多种初始化方式,可以通过n_init参数指定,以避免初始点的选择对聚类结果产生影响。 最后,可以通过matplotlib库将聚类后的图片可视化输出,方便观察聚类效果。在代码实现上,可以参考以下步骤: ``` # 导入库 import numpy as np from PIL import Image from sklearn.cluster import KMeans import matplotlib.pyplot as plt # 读入图片数据 pic = Image.open('image.jpg') pic_data = np.array(pic) # 归一化处理 pic_data_norm = pic_data.astype('float32') / 255.0 # 转化为二维向量 pic_data_norm_reshape = pic_data_norm.reshape((-1, 3)) # 初始化KMeans类 kmeans = KMeans(n_clusters=5, n_init=10, init='random') # 进行聚类操作 kmeans.fit(pic_data_norm_reshape) # 获取聚类结果 pic_data_compressed = kmeans.cluster_centers_[kmeans.labels_] pic_data_compressed_reshape = pic_data_compressed.reshape(pic_data_norm.shape) # 可视化输出 plt.imshow(pic_data_compressed_reshape) plt.show() ``` 在上述代码中,我们将图片数据读入,并进行了归一化处理和二维向量转换。然后,使用KMeans类进行聚类操作,并获取聚类结果。最后,利用matplotlib库可以可视化输出聚类后的图片。需要注意的是,在实际操作中,需要根据聚类效果进行参数调整,以得到更好的聚类结果。 ### 回答3: KMeans是一种常用的聚类算法。在Python中,我们可以使用sklearn库的KMeans模型来实现图片聚类。通过将像素数据转化为特征向量,可以将图像进行聚类。 首先,我们需要导入所需的库和图像。 ```python import matplotlib.pyplot as plt from sklearn.cluster import KMeans from sklearn.utils import shuffle from PIL import Image # 载入图片 img = Image.open("example.jpg") ``` 然后,我们需要将图像像素数据转化为特征向量。 ```python # 转化为numpy数组 img = shuffle(np.array(img, dtype=np.float64), random_state=0) w, h, d = tuple(img.shape) assert d == 3 image_array = np.reshape(img, (w * h, d)) ``` 随后,我们可以使用KMeans模型进行训练和预测。 ```python n_colors = 16 # 训练模型 kmeans = KMeans(n_clusters=n_colors, random_state=0).fit(image_array) # 预测每个像素的标签 labels = kmeans.predict(image_array) ``` 最后,我们可以将聚类结果重新转化为图像像素数据,并展示出来。 ```python # 重新组合为图像数据 new_image_array = np.zeros_like(image_array) for i, label in enumerate(labels): new_image_array[i] = kmeans.cluster_centers_[label] new_image = np.reshape(new_image_array, (w, h, d)) # 展示聚类结果 plt.imshow(new_image.astype(np.uint8)) plt.show() ``` 通过以上步骤,我们可以将一张图像进行16色聚类并展示出来。 总结来说,使用Python实现KMeans图像聚类需要以下步骤: 1. 导入所需的库和图像。 2. 将图像像素数据转化为特征向量。 3. 使用KMeans模型进行训练以及对图像进行预测。 4. 将预测得到的标签重新转化为图像像素数据,并展示聚类结果。 这是一个很简单但非常实用的技术,可以在很多领域中得到应用。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值