计算机视觉:聚类算法(K-Means)实现图像分割

文章介绍了K-Means聚类算法,一种无监督学习方法,如何用于图像分割。通过预处理、数据表示、选择聚类数、运行算法和结果可视化等步骤,将图像像素按颜色相似性分组。实验展示了不同聚类数(k=2,3,6)对分割效果的影响,强调选择合适K值的重要性。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

计算机视觉:聚类算法(K-Means)实现图像分割

什么是K-means聚类?

K-means聚类是一种无监督学习算法,用于将一组数据划分为K个不同的类别或簇。它基于数据点之间的相似性度量,将数据点分配到最接近的聚类中心。K-means算法的目标是最小化数据点与其所属聚类中心之间的平方距离和。

K-means聚类在图像分割中的应用

在图像分割中,K-means聚类可以用于将图像中的像素点分为不同的区域或对象。每个像素点可以表示为具有不同特征值的数据点。例如,可以使用像素的颜色值作为特征来执行基于颜色的图像分割。

使用K-means算法进行图像分割的步骤

  1. 图像预处理:在应用K-means算法之前,通常需要对图像进行预处理。预处理步骤可以包括图像大小调整、颜色空间转换、滤波等操作,以提取图像中的关键特征并减少噪音。
  2. 数据表示:将图像转换为适合K-means算法处理的数据表示形式。常见的表示形式包括每个像素的颜色特征向量或像素的位置特征向量。
  3. 选择聚类数:根据实际需求选择合适的聚类数K。聚类数决定了分割后的图像区域数量。
  4. 运行K-means算法:将图像数据输入K-means算法,并迭代更新聚类中心,直到算法收敛或达到预定的迭代次数。
  5. 分割结果可视化:根据聚类结果,将图像中的像素分配到不同的聚类簇,并使用合适的颜色或灰度级别将不同区域进行可视化展示。

实现代码

import numpy as np
import cv2

def preprocess_image(image):
    # 将图像转换为浮点型,并进行归一化
    normalized_image = image.astype(np.float32) / 255.0

    # 调整图像大小(可根据需要调整)
    resized_image = cv2.resize(normalized_image, (500, 500))

    # 进行模糊处理,以减少噪音
    blurred_image = cv2.GaussianBlur(resized_image, (5, 5), 0)

    return blurred_image

def kmeans_segmentation(image, num_clusters):
    # 将图像转换为一维向量
    pixel_values = image.reshape(-1, 3).astype(np.float32)

    # 运行K-means算法
    criteria = (cv2.TERM_CRITERIA_EPS + cv2.TERM_CRITERIA_MAX_ITER, 100, 0.1)
    _, labels, centers = cv2.kmeans(pixel_values, num_clusters, None, criteria, 10, cv2.KMEANS_RANDOM_CENTERS)

    # 将每个像素分配到最近的聚类中心
    segmented_image = centers[labels.flatten()].reshape(image.shape)

    return segmented_image

# 加载图像
image = cv2.imread('ex5/animal.jpg')

# 预处理图像
processed_image = preprocess_image(image)

# 对图像进行K-means分割
num_clusters = 100  # 设置聚类簇的数量
segmented_image = kmeans_segmentation(processed_image, num_clusters)

# 显示原始图像和分割结果
cv2.imshow('Original Image', image)
cv2.imshow('Segmented Image', segmented_image)
cv2.waitKey(0)
cv2.destroyAllWindows()

实验结果

原图

image-20230530150321169

k=2

image-20230530150444488

k=3

image-20230530152446078

k=6

image-20230530150406214

分析

K-means算法根据像素的颜色相似性将图像分割成不同的区域。分割结果展示了图像中不同区域的颜色聚类,相似颜色的像素被分配到同一个聚类簇中。通过分割结果可以清晰地看到图像中的不同物体或区域被分割出来,每个区域具有相似的颜色特征。
聚类簇数量选择会影响分割结果。较少的聚类簇数量可能导致细节丢失,将多个不同的物体或区域合并在一起;较多的聚类簇数量可能导致过细的分割,将一个物体或区域细分成多个部分。因此,选择合适的聚类簇数量对于获得良好的分割结果非常重要。即较小的K值可能导致合并和丢失细节,较大的K值可能导致过度细分。选择适当的聚类数量是实现准确图像分割的关键。

运用K-means算法进行图像分割, K-means算法是很典型的基于距离的聚类算法,采用距离作为相似性的评价指标,即认为两个对象的距离越近,其相似度就越大。该算法认为簇是由距离靠近的对象组成的,因此把得到紧凑且独立的簇作为最终目标。 k个初始类聚类中心点的选取对聚类结果具有较大的 公式 公式 影响,因为在该算法第一步中是随机的选取任意k个对象作为初始聚类的中心,初始地代表一个簇。该算法在每次迭代中对数据集中剩余的每个对象,根据其与各个簇中心的距离将每个对象重新赋给最近的簇。当考察完所有数据对象后,一次迭代运算完成,新的聚类中心被计算出来。如果在一次迭代前后,J的值没有发生变化,说明算法已经收敛。 算法过程如下: 1)从N个文档随机选取K个文档作为质心 2)对剩余的每个文档测量其到每个质心的距离,并把它归到最近的质心的类 3)重新计算已经得到的各个类的质心 4)迭代2~3步直至新的质心与原质心相等或小于指定阈值,算法结束 具体如下: 输入:k, data[n]; (1) 选择k个初始中心点,例如c[0]=data[0],…c[k-1]=data[k-1]; (2) 对于data[0]….data[n],分别与c[0]…c[k-1]比较,假定与c[i]差值最少,就标记为i; (3) 对于所有标记为i点,重新计算c[i]={ 所有标记为i的data[j]之和}/标记为i的个数; (4) 重复(2)(3),直到所有c[i]值的变化小于给定阈值。 折叠工作原理 K-MEANS算法的工作原理及流程 K-MEANS算法 输入:聚类个数k,以及包含 n个数据对象的数据库。 输出:满足方差最小标准的k个聚类
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值