OpenCV学习(23) 使用kmeans算法实现图像分割
本章我们用kmeans算法实现一个简单图像的分割。如下面的图像,我们知道图像分3个簇,背景、白色的任务,红色的丝带以及帽子。
Mat img = cv::imread("../kmeans.jpg");
namedWindow("image");
imshow("image", img);
首先我们会生成采样点,采样点包括原始图像中的所有像素点,采样点用32位浮点数表示,接着我们会定义一个标记矩阵labels,用来存放kmeans的结果。该矩阵中存放的是索引的采样点属于那一个簇,在本例子中,值应该是0,1或2,因为有3个簇。
//生成一维采样点,包括所有图像像素点,注意采样点格式为32bit浮点数。
Mat samples(img.cols*img.rows, 1, CV_32FC3);
//标记矩阵,32位整形
Mat labels(img.cols*img.rows, 1, CV_32SC1);
uchar* p;
int i, j, k=0;
for(i=0; i < img.rows; i++)
{
p = img.ptr<uchar>(i);
for(j=0; j< img.cols; j++)
{
samples.at<Vec3f>(k,0)[0] = float(p[j*3]);
samples.at<Vec3f>(k,0)[1] = float(p[j*3+1]);
samples.at<Vec3f>(k,0)[2] = float(p[j*3+2]);
k++;
}
}
int clusterCount = 3;
Mat centers(clusterCount, 1, samples.type());
kmeans(samples, clusterCount, labels,
TermCriteria( CV_TERMCRIT_EPS+CV_TERMCRIT_ITER, 10, 1.0),
3, KMEANS_PP_CENTERS, centers);
最后我们把不同的簇用不同灰度来表示,并把结果放在img1中。
//我们已知有3个聚类,用不同的灰度层表示。
Mat img1(img.rows, img.cols, CV_8UC1);
float step=255/(clusterCount - 1);
k=0;
for(i=0; i < img1.rows; i++)
{
p = img1.ptr<uchar>(i);
for(j=0; j< img1.cols; j++)
{
int tt = labels.at<int>(k, 0);
k++;
p[j] = 255 - tt*step;
}
}
namedWindow("image1");
imshow("image1", img1);
程序运行后的效果:
程序代码:工程FirstOpenCV17
OpenCV学习(23) 使用kmeans算法实现图像分割的更多相关文章
- OpenCV学习(20) grabcut分割算法
http://www.cnblogs.com/mikewolf2002/p/3330390.html OpenCV学习(20) grabcut分割算法 在OpenCV中,实现了grabcut分割算法, ...
- Kmeans算法学习与SparkMlLib Kmeans算法尝试
K-means算法是最为经典的基于划分的聚类方法,是十大经典数据挖掘算法之一.K-means算法的基本思想是:以空间中k个点为中心进行聚类,对最靠近他们的对象归类.通过迭代的方法,逐次更新各聚类中心的 ...
- 《opencv学习》 之 OTSU算法实现二值化
主要讲解OTSU算法实现图像二值化: 1.统计灰度级图像中每个像素值的个数. 2.计算第一步个数占整个图像的比例. 3.计算每个阈值[0-255]条件下,背景和前景所包含像素值总个数和总概率(就 ...
- OpenCV学习(22) opencv中使用kmeans算法
kmeans算法的原理参考:http://www.cnblogs.com/mikewolf2002/p/3368118.html 下面学习一下opencv中kmeans函数的使用. 首先我们 ...
- OpenCV 学习笔记 04 深度估计与分割——GrabCut算法与分水岭算法
1 使用普通摄像头进行深度估计 1.1 深度估计原理 这里会用到几何学中的极几何(Epipolar Geometry),它属于立体视觉(stereo vision)几何学,立体视觉是计算机视觉的一个分 ...
- k-means算法MATLAB和opencv代码
上一篇博客写了k-means聚类算法和改进的k-means算法.这篇博客就贴出相应的MATLAB和C++代码. 下面是MATLAB代码,实现用k-means进行切割: %%%%%%%%%%%%%%%% ...
- OpenCV学习(21) Grabcut算法详解
grab cut算法是graph cut算法的改进.在理解grab cut算之前,应该学习一下graph cut算法的概念及实现方式. 我搜集了一些graph cut资料:http://yunpan. ...
- OpenCV学习笔记(27)KAZE 算法原理与源码分析(一)非线性扩散滤波
http://blog.csdn.net/chenyusiyuan/article/details/8710462 OpenCV学习笔记(27)KAZE 算法原理与源码分析(一)非线性扩散滤波 201 ...
- 基于GraphCuts图割算法的图像分割----OpenCV代码与实现
转载请注明出处:http://blog.csdn.net/wangyaninglm/article/details/44151213, 来自:shiter编写程序的艺术 1.绪论 图切割算法是组合图论 ...
随机推荐
- NRF51822/NRF51802/NRF52810/NRF52811的详解区别
nRF51系列 - 多协议低功耗蓝牙和ANT/ANT+ 和2.4GHz专用系统级芯片 NRF51822-QFAA和NRF51802-QFAA在FLASH RAM的容量没有差别:区别在于:1.接收灵敏度 ...
- IDEA导包(以junit为例)
## IDEA导包(以junit为例) 1. 准备junit的jar包: * hamcrest-core-1.3.jar * junit-4.12.jar 2. 在项目中新建文件夹:lib 3. 将j ...
- 计算机视觉-sift(2)代码理解
之前结合不同人的资料理解了sift的原理,这里通过opencv中的代码来加深对sift的实现的理解. 使得能够从原理性理解到源码级的理解.不过该博文还是大量基于<赵春江, opencv2.4.9 ...
- MVC的BundleConfig类
在BundleConfig.cs文件中,包含了一些应用程序中使用的脚本和样式表的文件路径.并可以使用通配符.示例如下: using System.Web; using System.Web.Optim ...
- 【LeetCode206】Reverse Linked List★
题目描述: 解题思路: 关于单链表的反转有迭代和递归两种方法,方法不在多,本文主要介绍迭代的方法. 迭代的方法,要使用三个指针,需要注意一点的是指针的初始化,对第一个指针初始化为pre=null,第二 ...
- 20155217《网络对抗》Exp06 信息搜集与漏洞扫描
20155217<网络对抗>Exp06 信息搜集与漏洞扫描 实践内容 各种搜索技巧的应用 DNS IP注册信息的查询 基本的扫描技术:主机发现.端口扫描.OS及服务版本探测.具体服务的查点 ...
- 20155333 《网络对抗》Exp3 免杀原理与实践
20155333 <网络对抗>Exp3 免杀原理与实践 基础问题回答 (1)杀软是如何检测出恶意代码的? 基于特征码的检测: 启发式恶意软件检测: 基于行为的恶意软件检测. (2)免杀是做 ...
- vue 打包后,后缀名为.woff等字体问题不能用解决办法
1.打开 build / webpack.prod.conf.js ,找到 module: { rules: utils.styleLoaders({ sourceMap: config.build. ...
- 微信小程序 倒计时
这两天在看微信小程序,参考了网上的资料,做了一个倒计时的练习,记录如下. 本文作者:罗兵 原地址:https://www.cnblogs.com/hhh5460/p/9981064.html 0.效果 ...
- LOJ#2799. 「CCC 2016」生命之环
题意 给你一个 \(n\) 个 \(\rm 01\) 组成的环,每次操作之后每个位置为1当且仅当他的左右恰好有1个1.输出进行 \(T\) 次操作之后的环. \(n\leq 10^5, T\leq 1 ...