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),也称概率分布函数,有的时候又简称概率分布函 ...
随机推荐
- JavaScript判断是否是数字
JavaScript判断是否是数字的几种方法 isNaN() /** * 判断是否是数字 */ function isNumber(value){ if(isNaN(value)){ return f ...
- 6、zabbix自定义监控
一.概述 为什么需要自定义监控呢? 虽然zabbix已经给我们准备好了很多的模板,但是有的东西还是无法监控,这时候就要我们自定义监控了. 自定义监控的思路? 比如我们现在想要监控这个值,如下所示,模板 ...
- destoon模块绑定二级域名出现 File not found解决办法
昨天晚上帮一个朋友给我说他绑定模块二级域名出现 File not found,所以今天分享关于解决办法. 模块启用二级域名后,首页打开正常,但是点内容页和列表页出现File not found. 解决 ...
- java中的字符串二
public class TestString { public static void main(String[] args) { // TODO Auto-generated method stu ...
- matlib调用python时转py格式为matlib格式
因为需要,我用matlib调用python代码. 调用成功但是遇到问题 如下 调用完的结果为python格式 (py.list,py.xx) matlib根本不能用 查了半天一个能解决的方法都没 ...
- jQuery中的文档处理(五)
1. append(content|fn), 向每个匹配的元素内部追加内容 在内部结尾添加. 参数说明: content:String, Element, jQuery,要追加到目标中的内容 func ...
- MDK编译优化笔记
在一次使用MDk的编译优化等级比较高的时候发现编译不优化时功能正常,开了优化等级02就出现异常,调试中看了很多博客总结一下. 一个变量,如果你的主程序要用到,同时中断还要用到,要加volatile修饰 ...
- SQL Server 迁移数据库 (三)使用SQL脚本
1. 创建脚本 1.1 在需要迁移的数据库上右击>Tasks>Generate Scrips 1.2 前两步直接Next,第三步我这里选择Save to Clipboard,因为如果选Sa ...
- Vue 使用comouted计算属性
computed计算属性 使用方法见代码: <!doctype html> <html lang="en"> <head> <meta c ...
- vue 使用localstorage实现面包屑
mutation.js代码: changeRoute(state, val) { let routeList = state.routeList; let isFind = false; let fi ...