利用kmeans算法,将彩色图像的像素点作为样本,rgb值作为样本的属性,

对图像所有的像素点进行分类,从而实现对图像中目标的分割。

c++代码(openCV 2.4.11)

Scalar colorTab[] = {
Scalar(0, 0, 0),
Scalar(255, 255, 255),
};
void color_cluster(const Mat& origin_img_rgb) {
// 1、将图像按像素点转化为样本矩阵samples
Mat samples = Mat(origin_img_rgb.size().width*origin_img_rgb.size().height, 1, CV_32FC3);
int k = 0;
for (int i = 0; i < origin_img_rgb.rows; i++) {
for (int j = 0; j < origin_img_rgb.cols; j++) {
samples.at<cv::Vec3f>(k, 0)[0] = origin_img_rgb.at<cv::Vec3b>(i, j)[0];
samples.at<cv::Vec3f>(k, 0)[1] = origin_img_rgb.at<cv::Vec3b>(i, j)[1];
samples.at<cv::Vec3f>(k, 0)[2] = origin_img_rgb.at<cv::Vec3b>(i, j)[2];
++k;
}
} // 2、聚类
Mat labels;
Mat centers;
int nCuster = 2; //聚类类别数 // samples 输入样本浮点矩阵
// nCuster 给定聚类类别数量
// labels 每个样本对应的类别标识
// TermCriteria 指定聚类的最大迭代次数或精度
kmeans(samples, nCuster, labels, TermCriteria(CV_TERMCRIT_ITER, 10, 1.0), 3, KMEANS_RANDOM_CENTERS, centers); // 3、将聚类结果转换为图像显示出来
k = 0;
Mat img(origin_img_rgb.size(), CV_8UC3);
for (int i = 0; i < origin_img_rgb.rows; i++) {
for (int j = 0; j < origin_img_rgb.cols; j++) {
int clusterIdx = labels.at<int>(k++, 0);
circle(img, {j,i}, 2, colorTab[clusterIdx], CV_FILLED, CV_AA);
}
}
imshow("originimg", origin_img_rgb);
imshow("clusters", img);
char key = (char)waitKey();
if (key == 27 || key == 'q' || key == 'Q') {return ;}
}

效果:

opencv kmeans 图像分割的更多相关文章

  1. opencv::KMeans图像分割

    #include <opencv2/opencv.hpp> #include <iostream> using namespace cv; using namespace st ...

  2. OpenCV 之 图像分割 (一)

    1  基于阈值 1.1  基本原理 灰度阈值化,是最简单也是速度最快的一种图像分割方法,广泛应用在硬件图像处理领域 (例如,基于 FPGA 的实时图像处理). 假设输入图像为 f,输出图像为 g,则经 ...

  3. OpenCV kmeans代码

    代码:出处忘了 // // Example 13-1. Using K-means // // /* *************** License:************************* ...

  4. opencv::分水岭图像分割

    分水岭分割方法原理 (3种) - 基于浸泡理论的分水岭分割方法 (距离) - 基于连通图的方法 - 基于距离变换的方法 图像形态学操作: - 腐蚀与膨胀 - 开闭操作 分水岭算法运用 - 分割粘连对象 ...

  5. opencv::KMeans方法概述

    KMeans方法概述 . 无监督学习方法 . 分类问题,输入分类数目,初始化中心位置 . 硬分类方法,以距离度量 . 迭代分类为聚类    //---------- //迭代算法的终止准则 //--- ...

  6. opencv 金字塔图像分割

    我所知的opencv中分割函数:watershed(只是看看效果,不能返回每类pixel类属),cvsegmentImage,cvPyrSegmentation(返回pixel类属) 金字塔分割原理篇 ...

  7. OpenCV meanshift 图像分割代码

    参考:这个帖子的主要代码有错误,根据回帖改了一些 http://www.cnblogs.com/tornadomeet/archive/2012/06/06/2538695.html // means ...

  8. OpenCV 1 图像分割--分水岭算法代码

    // watershed_test20140801.cpp : 定义控制台应用程序的入口点. // #include "stdafx.h" // // ch9_watershed ...

  9. opencv 彩色图像分割(inrange)

    灰度图像大多通过算子寻找边缘和区域生长融合来分割图像. 彩色图像增加了色彩信息,可以通过不同的色彩值来分割图像,常用彩色空间HSV/HSI, RGB, LAB等都可以用于分割! 笔者主要介绍inran ...

随机推荐

  1. Android应用开发基础篇(11)-----ViewFlipper

    链接地址:http://www.cnblogs.com/lknlfy/archive/2012/03/01/2376067.html 一.概述 ViewFlipper这个部件是用来实现多页显示的,多页 ...

  2. BZOJ 2329: [HNOI2011]括号修复( splay )

    把括号序列后一定是))))((((这种形式的..所以维护一个最大前缀和l, 最大后缀和r就可以了..答案就是(l+1)/2+(r+1)/2...用splay维护,O(NlogN). 其实还是挺好写的, ...

  3. new Date()的参数

    前两天发现手机页面的倒计时在Android上正常显示,在iPhone却不能显示. 后来又发现在ff和ie里也不显示.(以前只在chrome里看过,显示正常). 后来同事改了new Date()里字符串 ...

  4. HDU3863:No Gambling

    Problem Description One day, Flyvan introduced a new game to his two friends, Oregon Maple and Grape ...

  5. SQLITE 多进程查询出错database is locked

    程序比较简单: 父进程查询数据库A表,没有更新操作 子进程同时查询数据库A表,查询出来的内容更新B表. 两个进程都放到while(1)循环中,速度慢的话就是2S执行一次就没有错,执行的速度快的话就会报 ...

  6. 怎么给没链接的flash加超链接

    最近开始准备设计一个广告条,本想用阿里妈妈的的banner marker来设计,却遗憾的发现,banner marker已经实行收费模式了. 我不得不启用另一款在线banner生成工具,百度旗下的&q ...

  7. Delphi 的动态数组

    传统的Pascal 语言其数组大小是预先确定的,当你用数组结构声明数据类型时,你必须指定数组元素的个数.专业程序员也许知道些许动态数组的实现技术,一般是采用指针,用手工分配并释放所需的内存. Delp ...

  8. php中 $$str 中 "$$" 的解释

    原文:php中 $$str 中 "$$" 的解释 这种写法称为可变变量有时候使用可变变量名是很方便的.就是说,一个变量的变量名可以动态的设置和使用.一个普通的变量通过声明来设置,例 ...

  9. HDU 2393 Higher Math

    #include <cstdio> #include <string> using namespace std; void swap(int& a,int& b ...

  10. Android Manifest.xml 结构详解

    关于AndroidManifest.xml AndroidManifest.xml 是每个android程序中必须的文件.它位于整个项目的根目录,描述了package中暴露的组件(activities ...