89.基于聚类的kmeans图像分割

目录

        1 概念讲解及用处

        2 函数详解

        3 原理

        4 使用C++编写代码进行实现

        1 概念讲解及用处

        基于聚类的分割是一种图像分割方法,它通过将像素分成不同的群集或聚类来实现图像的分割。聚类算法可以根据像素的特征和相似度,将图像中的像素划分为具有相似属性的群集,从而实现对图像的分割。

        K-means聚类是一种常用的无监督学习算法,用于将数据集划分成K个不同的簇。K-means的目标是通过最小化每个样本点与所属簇的质心之间的距离来实现聚类。

        基于聚类的分割在计算机视觉和图像处理领域有着广泛的应用,例如目标检测、图像分割、图像分类等。

        2 函数详解

        OpenCV中提供了多个函数来实现基于聚类的分割,其中最常用的是K-means聚类算法。函数的原型如下:

void kmeans(InputArray data, int K, InputOutputArray bestLabels, TermCriteria criteria, int attempts, int flags, OutputArray centers = noArray());

参数说明:

data:输入的样本数据,通常是一个N×D的矩阵,其中N是样本数量,D是每个样本的维度。

K:聚类的个数。

bestLabels:输出的标签矩阵,用于存储每个样本所属的聚类标签。

criteria:停止迭代的准则。

attempts:重复运行算法的次数,返回最佳结果。

flags:额外的标志参数,控制算法的行为。

centers:输出的聚类中心,是一个K×D的矩阵。

        3 原理

        K-means聚类算法的数学原理基于距离度量和最小化平方误差的思想。其原理如下:

        假设有N个样本数据点 {x1, x2, ..., xn},要将它们分成K个聚类。每个聚类由一个中心点表示 {c1, c2, ..., ck}。目标是寻找一组聚类中心,使得每个样本点与其所属聚类中心之间的距离最小。可以使用欧氏距离或其他距离度量方法来衡量样本与聚类中心之间的距离。

具体的K-means算法可以通过以下步骤实现:
        (1)初始化:随机选择K个初始质心(centroid),可以从数据集中随机选择K个样本作为初始质心。

        (2)分配样本点到簇:对于每个样本点,计算其与所有质心的距离,并将其分配到距离最近的簇。

        (3)更新质心:对于每个簇,根据簇中所有样本点的均值计算新的质心位置。

        (4)重复步骤2和步骤3,直到满足终止准则,例如达到最大迭代次数、质心变化小于某个阈值等。

        (5)输出聚类结果:最终得到K个簇,每个簇包含一组相似的样本点。

K-means算法的优点是简单且高效,但也有一些注意事项:

        初始质心的选择可能会影响最终结果,因此可以多次运行算法并选择最好的结果。

        K值的选择是一个重要的问题,需要根据具体应用场景和数据特点来决定。

        K-means对离群点敏感,可能会导致离群点单独形成一个簇,或者将其归入最近的簇中。

        K-means假设每个簇是凸形的,并且在各个维度上具有相等的方差,这些假设在某些情况下可能不满足。

        总结起来,K-means算法通过迭代更新质心并分配样本点到最近的质心来实现聚类。它是一种简单而有效的聚类算法,在处理大规模数据集时也具有较高的效率。

        4 使用C++编写代码进行实现

        下面是使用C++编写的示例代码,演示了如何在OpenCV中使用K-means算法进行基于聚类的分割:

#include <iostream>
#include <opencv2/opencv.hpp>

using namespace std;
using namespace cv;

int main() {
    // 加载输入图像
    Mat image = imread("image.jpg");

    
    Vec3b colorArr[6] = {
        Vec3b(0,0,255),
        Vec3b(0,255,0),
        Vec3b(255,0,0),
        Vec3b(0,255,255),
        Vec3b(255,0,255),
        Vec3b(255,255,0),
    };
    // 将图像转换为一维向量
    Mat samples = image.reshape(3, image.rows* image.cols);

    // 转换为32位浮点型数据
    Mat samples32F;
    samples.convertTo(samples32F, CV_32F);

    // 设置聚类的个数
    int K = 4;

    // 定义输出标签矩阵
    Mat labels;

    // 定义停止准则
    TermCriteria criteria(TermCriteria::EPS + TermCriteria::COUNT, 100, 0.1);

    // 运行K-means算法进行聚类
    kmeans(samples32F, K, labels, criteria, 10, KMEANS_RANDOM_CENTERS);

    // 将每个像素赋值为其所属聚类中心的颜色
    Mat segmented = Mat(image.size(), image.type());
    for (int i = 0; i < image.rows; i++) {
        for (int j = 0; j < image.cols; j++) {
            int label = labels.at<int>(i * image.cols + j);
            segmented.at<Vec3b>(i, j) = colorArr[label];
        }
    }

    // 显示结果
    imshow("Input Image", image);
    imshow("Segmented Image", segmented);
    waitKey(0);

    return 0;
}

        首先加载输入图像,并将其转换为一维向量。然后将向量转换为32位浮点型数据。接下来,设定聚类的个数为4,并定义一个输出标签矩阵用于存储每个样本所属的聚类标签。同时定义停止准则,指定迭代次数和中心点的变化阈值。然后,调用kmeans()函数,传入样本数据、聚类个数、输出标签矩阵和其他参数来运行K-means算法进行聚类。最后,将每个像素赋值为其所属聚类中心的颜色,并显示原始图像和分割结果。

 

  • 0
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
Kmeans 聚类分割方法是一种常见的无监督机器学习算法,它可以将数据集分成若干个类别,并且每个类别内部的数据点相似度较高,不同类别之间的数据点相似度较低。 下面我将详细介绍 Kmeans 聚类分割方法。 一、算法原理 Kmeans 聚类分割方法的基本思想是:将样本数据集划分成 K 个不同的簇,使得簇内的数据点相似度尽可能高,不同簇之间的数据点相似度尽可能低。其中,K 是用户自定义的聚类个数。 Kmeans 算法的流程如下: 1. 随机选择 K 个点作为初始的聚类中心。 2. 根据每个数据点到聚类中心的距离,将数据点划分到距离最近的聚类中心所在的簇中。 3. 计算每个簇的中心点,作为新的聚类中心。 4. 重复步骤 2 和步骤 3,直到聚类中心不再发生变化,或者达到最大迭代次数。 二、算法优缺点 Kmeans 聚类分割方法的优点如下: 1. 简单易懂,计算速度快,适用于大规模数据集。 2. 算法的结果较为稳定,不同的随机初始选择聚类中心,得到的聚类结果较为相似。 3. 可以自定义聚类的个数。 4. 适用于处理数值型数据。 Kmeans 聚类分割方法的缺点如下: 1. 对离群点敏感。由于算法是基于距离计算的,所以对于离群点的处理较为困难。 2. 对于非球形的数据分布,聚类效果不佳。 3. 对于不同的初始聚类中心的选择,可能会导致聚类结果不同。 三、算法应用 Kmeans 聚类分割方法广泛应用于聚类分析、图像分割、文本聚类、生物信息学等领域。 在聚类分析中,Kmeans 聚类分割方法可以将数据集划分成不同的聚类,从而发现数据集内部的结构和规律。 在图像分割中,Kmeans 聚类分割方法可以将图像分成不同的区域,从而识别图像中的不同物体和背景。 在文本聚类中,Kmeans 聚类分割方法可以将文本数据集划分成不同的主题,从而发现文本数据集内部的结构和规律。 在生物信息学中,Kmeans 聚类分割方法可以将基因数据集划分成不同的类别,从而发现基因之间的关系和规律。 四、总结 Kmeans 聚类分割方法是一种常见的无监督机器学习算法,它可以将数据集分成若干个类别,并且每个类别内部的数据点相似度较高,不同类别之间的数据点相似度较低。Kmeans 算法的优点是简单易懂,计算速度快,适用于大规模数据集,适用于处理数值型数据;缺点是对离群点敏感,对于非球形的数据分布,聚类效果不佳,对于不同的初始聚类中心的选择,可能会导致聚类结果不同。Kmeans 聚类分割方法广泛应用于聚类分析、图像分割、文本聚类、生物信息学等领域。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

别叭叭儿—好好学

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值