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),也称概率分布函数,有的时候又简称概率分布函 ...
随机推荐
- 使用android日志工具
Log的级别? 日志级别按照高低排序为:ERROR,WARN,INFO,DEBUG,VERBOSE, 日志输出: Log.e()输出ERROR级别的日志信息 Log.w()输出WARN,ERROR级别 ...
- 什么是测试系统工程师(TSE)?
深圳市共创力研发咨询 杨学明/文 TSE(Test System Engineer)简称测试系统工程师,作为系统工程(SE)团队的一员,很多公司目前还没有这样的角色,导致测试部分往往处理弱势,第一,不 ...
- 故障排除指南(TSG)-ORA-01552: Cannot Use System Rollback Segment for Non-System Tablespace (Doc ID 1579215.1)
Troubleshooting Guide (TSG) - ORA-01552: Cannot Use System Rollback Segment for Non-System Tablespac ...
- Mysql—数据备份与恢复
数据备份 # 备份单个数据库 [root@localhost ~]# mysqldump -h主机名 -u用户名 -p密码 数据库名字 > 备份的数据库名字.sql [root@localhos ...
- [视频教程] ubuntu系统下安装最新版PHP7.3.X环境
视频地址: https://www.bilibili.com/video/av69088870/ 笔记: 先安装一下这个命令 add-apt-repositoryapt-get install sof ...
- ARM 寻址方式
寻址方式有 9种 1.寄存器 2.立即数 3.寄存器位移 4.寄存器间接 5.基址 6.多寄存器 7.堆栈 8.块拷贝 9.相对 1. MOV R1,R2 R1 = R2 2. MOV R0,#0x1 ...
- python3.5.3rc1学习四:类
class calculator: def add(x,y): return x + y print(added) def sub(x,y): return x - y print(sub) def ...
- day51_9_15_Django
一.pycharm接受网页信息原理. 如何实现在后端接受浏览器的数据,并解析出有用的信息呢? 使用socket编写网络连接,然后通过浏览器访问ip+端口号. import socket def ind ...
- 线程休眠sleep
一.sleep的作用 sleep() 定义在Thread.java中.sleep() 的作用是让当前线程休眠,即当前线程会从“运行状态”进入到“休眠(阻塞)状态”.sleep()会指定休眠时间,线程休 ...
- Git仓库占用空间太大的解决方法
git gc --aggressive对本地git库进行更彻底清理和优化,这个指令花费的时间也会更长. 胡云飞系统部署搭建整体把控:git gc --auto这是一个设置的指令,并不会进行gc操作.如 ...