前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >C++ OpenCV图像分割之KMeans方法

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

作者头像
Vaccae
发布2019-07-24 13:12:47
3.7K0
发布2019-07-24 13:12:47
举报
文章被收录于专栏:微卡智享微卡智享

前言

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-

本文参与 腾讯云自媒体分享计划,分享自微信公众号。
原始发表:2018-11-15,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 微卡智享 微信公众号,前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体分享计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档