C++ OpenCV图像分割之KMeans方法

前言

kmeans算法主要用来实现自动聚类,是一种非监督的机器学习算法,使用非常广泛。在opencv3.0中提供了这样一个函数,直接调用就能实现自动聚类,非常方便。

API介绍

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

参数说明:

data:  需要自动聚类的数据,一般是一个Mat。浮点型的矩阵,每行为一个样本。


k: 取成几类,比较关键的一个参数。


bestLabels:  返回的类别标记,整型数字。


criteria: 算法结束的标准,获取期望精度的迭代最大次数


attempts:  判断某个样本为某个类的最少聚类次数,比如值为3时,则某个样本聚类3次都为同一个类,则确定下来。


flags:  确定簇心的计算方式。有三个值可选:KMEANS_RANDOM_CENTERS 表示随机初始化簇心。KMEANS_PP_CENTERS 表示用kmeans++算法来初始化簇心(没用过),KMEANS_USE_INITIAL_LABELS 表示第一次聚类时用用户给定的值初始化聚类,后面几次的聚类,则自动确定簇心。


centers: 用来初始化簇心的。与前一个flags参数的选择有关。如果选择KMEANS_RANDOM_CENTERS随机初始化簇心,则这个参数可省略。


代码演示

我们再新建一个项目名为opencv--kmeans,按照配置属性(VS2017配置OpenCV通用属性),然后在源文件写入#include和main方法.

首先定义一个颜色数组用于后面分割图像用

获取源图像的宽度,高度以及颜色的通道数

定义KMeans方法用到的初始值

将源图上的RGB数据转换为样本数据

运行KMeans进行图像分割

将分割结果重新绘制到新的Mat里

显示结果


接下来我们看一下运行的效果

上面可以看到我们完美的把背景和我们的人物分割开了。


-END-

长按下方二维码关注微卡智享

  • 0
    点赞
  • 10
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

打赏作者

Vaccae

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

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

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

打赏作者

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

抵扣说明:

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

余额充值