opencv::GMM(高斯混合模型)
GMM方法概述:基于高斯混合模型期望最大化。
高斯混合模型 (GMM)
高斯分布与概率密度分布 - PDF
初始化
初始化EM模型:
Ptr<EM> em_model = EM::create();
em_model->setClustersNumber(numCluster);
em_model->setCovarianceMatrixType(EM::COV_MAT_SPHERICAL);
em_model->setTermCriteria(TermCriteria(TermCriteria::EPS + TermCriteria::COUNT, 100, 0.1));
em_model->trainEM(points, noArray(), labels, noArray());
#include <opencv2/opencv.hpp>
#include <iostream> using namespace cv;
using namespace cv::ml;
using namespace std; int main(int argc, char** argv) {
Mat img = Mat::zeros(, , CV_8UC3);
RNG rng(); Scalar colorTab[] = {
Scalar(, , ),
Scalar(, , ),
Scalar(, , ),
Scalar(, , ),
Scalar(, , )
}; int numCluster = rng.uniform(, );
printf("number of clusters : %d\n", numCluster); int sampleCount = rng.uniform(, );
Mat points(sampleCount, , CV_32FC1);
Mat labels; // 生成随机数
for (int k = ; k < numCluster; k++) {
Point center;
center.x = rng.uniform(, img.cols);
center.y = rng.uniform(, img.rows);
Mat pointChunk = points.rowRange(k*sampleCount / numCluster,
k == numCluster - ? sampleCount : (k + )*sampleCount / numCluster); rng.fill(pointChunk, RNG::NORMAL, Scalar(center.x, center.y), Scalar(img.cols*0.05, img.rows*0.05));
} randShuffle(points, , &rng);
//初始化EM模型
Ptr<EM> em_model = EM::create();
em_model->setClustersNumber(numCluster);
em_model->setCovarianceMatrixType(EM::COV_MAT_SPHERICAL);
em_model->setTermCriteria(TermCriteria(TermCriteria::EPS + TermCriteria::COUNT, , 0.1));
em_model->trainEM(points, noArray(), labels, noArray()); // 处理每个像素
Mat sample(, , CV_32FC1);
for (int row = ; row < img.rows; row++) {
for (int col = ; col < img.cols; col++) {
sample.at<float>() = (float)col;
sample.at<float>() = (float)row;
int response = cvRound(em_model->predict2(sample, noArray())[]);
Scalar c = colorTab[response];
//填充
circle(img, Point(col, row), , c*0.75, -);
}
} // 画出采样数据
for (int i = ; i < sampleCount; i++) {
Point p(cvRound(points.at<float>(i, )), points.at<float>(i, ));
circle(img, p, , colorTab[labels.at<int>(i)], -);
} imshow("GMM-EM Demo", img); waitKey();
return ;
}
#include <opencv2/opencv.hpp>
#include <iostream> using namespace cv;
using namespace cv::ml;
using namespace std; int main(int argc, char** argv) {
Mat src = imread("D:/images/cvtest.png");
if (src.empty()) {
printf("could not load iamge...\n");
return -;
}
namedWindow("input image", CV_WINDOW_AUTOSIZE);
imshow("input image", src); // 初始化
int numCluster = ;
const Scalar colors[] = {
Scalar(, , ),
Scalar(, , ),
Scalar(, , ),
Scalar(, , )
}; int width = src.cols;
int height = src.rows;
int dims = src.channels();
int nsamples = width * height;
Mat points(nsamples, dims, CV_64FC1);
Mat labels;
Mat result = Mat::zeros(src.size(), CV_8UC3); // 图像RGB像素数据转换为样本数据
int index = ;
for (int row = ; row < height; row++) {
for (int col = ; col < width; col++) {
index = row * width + col;
Vec3b rgb = src.at<Vec3b>(row, col);
points.at<double>(index, ) = static_cast<int>(rgb[]);
points.at<double>(index, ) = static_cast<int>(rgb[]);
points.at<double>(index, ) = static_cast<int>(rgb[]);
}
} // EM Cluster Train
Ptr<EM> em_model = EM::create();
em_model->setClustersNumber(numCluster);
em_model->setCovarianceMatrixType(EM::COV_MAT_SPHERICAL);
em_model->setTermCriteria(TermCriteria(TermCriteria::EPS + TermCriteria::COUNT, , 0.1));
em_model->trainEM(points, noArray(), labels, noArray()); // 对每个像素标记颜色与显示
Mat sample(dims, , CV_64FC1);
double time = getTickCount();
int r = , g = , b = ;
for (int row = ; row < height; row++) {
for (int col = ; col < width; col++) {
/*index = row * width + col;
int label = labels.at<int>(index, 0);
Scalar c = colors[label];
result.at<Vec3b>(row, col)[0] = c[0];
result.at<Vec3b>(row, col)[1] = c[1];
result.at<Vec3b>(row, col)[2] = c[2];*/ b = src.at<Vec3b>(row, col)[];
g = src.at<Vec3b>(row, col)[];
r = src.at<Vec3b>(row, col)[];
sample.at<double>() = b;
sample.at<double>() = g;
sample.at<double>() = r;
int response = cvRound(em_model->predict2(sample, noArray())[]);
Scalar c = colors[response];
result.at<Vec3b>(row, col)[] = c[];
result.at<Vec3b>(row, col)[] = c[];
result.at<Vec3b>(row, col)[] = c[];
}
}
printf("execution time(ms) : %.2f\n", (getTickCount() - time) / getTickFrequency() * );
imshow("EM-Segmentation", result); waitKey();
return ;
}
opencv::GMM(高斯混合模型)的更多相关文章
- GMM高斯混合模型学习笔记(EM算法求解)
提出混合模型主要是为了能更好地近似一些较复杂的样本分布,通过不断添加component个数,能够随意地逼近不论什么连续的概率分布.所以我们觉得不论什么样本分布都能够用混合模型来建模.由于高斯函数具有一 ...
- K-Means(K均值)、GMM(高斯混合模型),通俗易懂,先收藏了!
1. 聚类算法都是无监督学习吗? 什么是聚类算法?聚类是一种机器学习技术,它涉及到数据点的分组.给定一组数据点,我们可以使用聚类算法将每个数据点划分为一个特定的组.理论上,同一组中的数据点应该具有相似 ...
- GMM高斯混合模型 学习(2)
watermark/2/text/aHR0cDovL2Jsb2cuY3Nkbi5uZXQvaHpxMjAwODExMjExMDc=/font/5a6L5L2T/fontsize/400/fill/I0 ...
- opencv的高斯混合模型
http://blog.jasonding.top/2015/04/05/Machine%20Learning/%E3%80%90%E8%AE%A1%E7%AE%97%E6%9C%BA%E8%A7%8 ...
- EM算法和高斯混合模型GMM介绍
EM算法 EM算法主要用于求概率密度函数参数的最大似然估计,将问题$\arg \max _{\theta_{1}} \sum_{i=1}^{n} \ln p\left(x_{i} | \theta_{ ...
- 高斯混合模型GMM与EM算法的Python实现
GMM与EM算法的Python实现 高斯混合模型(GMM)是一种常用的聚类模型,通常我们利用最大期望算法(EM)对高斯混合模型中的参数进行估计. 1. 高斯混合模型(Gaussian Mixture ...
- paper 62:高斯混合模型(GMM)参数优化及实现
高斯混合模型(GMM)参数优化及实现 (< xmlnamespace prefix ="st1" ns ="urn:schemas-microsoft-com:of ...
- 高斯混合模型(理论+opencv实现)
查资料的时候看了一个不文明的事情,转载别人的东西而不标注出处,结果原创无人知晓,转载很多人评论~~标注了转载而不说出处这样的人有点可耻! 写在前面: Gaussian Mixture Model (G ...
- 高斯混合模型(GMM)
复习: 1.概率密度函数,密度函数,概率分布函数和累计分布函数 概率密度函数一般以大写“PDF”(Probability Density Function),也称概率分布函数,有的时候又简称概率分布函 ...
随机推荐
- Gatech OMSCS的申请和学习之奥妙
https://zhuanlan.zhihu.com/p/54680585 我写东西一向希望能给大家带来正能量,提供有价值的信息,不辱没母校的厚德价值观. 我是传统没落工科毕业后开发软件,但是一直没下 ...
- gyp编译工具
最近用到了 node-gyp 这个工具, 是node 社区对 google gyp 编译工具的一个封装, 使用 node-gyp 工具可以用C++为node 项目编写 addon. 了解了一下 goo ...
- webpack中使用jquery
首先我只有一个js文件,只用在那个文件中引入,因此 一 下载包 npm install jquery --save 二 在使用的jquery的文件顶部输入js代码 import $ from 'jq ...
- Ubuntu18.04安装Cuda10.1
注:如果使用anaconda,貌似不需要手动安装Cuda和cudnn,安装tensorflow时会自动安装 1.官方教程https://docs.nvidia.com/cuda/cuda-instal ...
- 跳跃空间(链表)排序 选择排序(selection sort),插入排序(insertion sort)
跳跃空间(链表)排序 选择排序(selection sort),插入排序(insertion sort) 选择排序(selection sort) 算法原理:有一筐苹果,先挑出最大的一个放在最后,然后 ...
- C++学习03_对象
1.类 类决定了一个对象具有什么样的属性功能. class MyFirstClass { }; //跟C++结构情况相似 //类的第一个字母采用大写是一种习惯的上的标准. //与C++结构情况类似 类 ...
- 攻防世界web之ics-05
本文借鉴以下两篇文章的指导 https://www.jianshu.com/p/5a502873635b https://blog.csdn.net/about23/article/details/9 ...
- C++标准库删除字符串中指定字符,比如空格
参见:https://zh.cppreference.com/w/cpp/algorithm/remove 使用 erase 和 remove 配合. #include <algorithm&g ...
- 求GCD(最大公约数)的两种方式
求GCD(最大公约数)的两种方式 这篇随笔讲解C++语言程序设计与应用中求GCD(最大公约数,下文使用GCD代替)的两种常用方式:更相减损法和辗转相除法,前提要求是具有小学数学的基本素养,知道GCD是 ...
- CF731C Socks
CF731C Socks 洛谷评测传送门 题目描述 Arseniy is already grown-up and independent. His mother decided to leave h ...