C++ OpenCV图像分割之如何实现高斯混合模型

发布时间:2021-11-26 10:43:03 作者:小新
来源:亿速云 阅读:317

这篇文章主要介绍了C++ OpenCV图像分割之如何实现高斯混合模型,具有一定借鉴价值,感兴趣的朋友可以参考下,希望大家阅读完这篇文章之后大有收获,下面让小编带着大家一起了解一下。

前言

Gaussian Mixture Model (GMM)。事实上,GMM 和 k-means 很像,不过 GMM 是学习出一些概率密度函数来(所以 GMM 除了用在 clustering 上之外,还经常被用于 density estimation ),简单地说,k-means 的结果是每个数据点被 assign 到其中某一个 cluster 了,而 GMM 则给出这些数据点被 assign 到每个 cluster 的概率,又称作 soft assignment 。

  得出一个概率有很多好处,因为它的信息量比简单的一个结果要多,比如,我可以把这个概率转换为一个 score ,表示算法对自己得出的这个结果的把握。也许我可以对同一个任务,用多个方法得到结果,最后选取“把握”最大的那个结果;另一个很常见的方法是在诸如疾病诊断之类的场所,机器对于那些很容易分辨的情况(患病或者不患病的概率很高)可以自动区分,而对于那种很难分辨的情况,比如,49% 的概率患病,51% 的概率正常,如果仅仅简单地使用 50% 的阈值将患者诊断为“正常”的话,风险是非常大的,因此,在机器对自己的结果把握很小的情况下,会“拒绝发表评论”,而把这个任务留给有经验的医生去解决。

高斯混合模型--GMM(Gaussian Mixture Model)

统计学习的模型有两种,一种是概率模型,一种是非概率模型。

所谓概率模型,是指训练模型的形式是P(Y|X)。输入是X,输出是Y,训练后模型得到的输出不是一个具体的值,而是一系列的概率值(对应于分类问题来说,就是输入X对应于各个不同Y(类)的概率),然后我们选取概率最大的那个类作为判决对象(软分类--soft assignment)。所谓非概率模型,是指训练模型是一个决策函数Y=f(X),输入数据X是多少就可以投影得到唯一的Y,即判决结果(硬分类--hard assignment)。

所谓混合高斯模型(GMM)就是指对样本的概率密度分布进行估计,而估计采用的模型(训练模型)是几个高斯模型的加权和(具体是几个要在模型训练前建立好)。每个高斯模型就代表了一个类(一个Cluster)。对样本中的数据分别在几个高斯模型上投影,就会分别得到在各个类上的概率。然后我们可以选取概率最大的类所为判决结果。

从中心极限定理的角度上看,把混合模型假设为高斯的是比较合理的,当然,也可以根据实际数据定义成任何分布的Mixture Model,不过定义为高斯的在计算上有一些方便之处,另外,理论上可以通过增加Model的个数,用GMM近似任何概率分布。

代码演示

我们再新建一个项目名为opencv--GMM,按照配置属性(VS2017配置OpenCV通用属性),然后在源文件写入#include和main方法.

C++ OpenCV图像分割之如何实现高斯混合模型

先初始化数据

C++ OpenCV图像分割之如何实现高斯混合模型

获取源图像的宽,高和图像的通道数及总的像素点数,并定义要用的Mat

C++ OpenCV图像分割之如何实现高斯混合模型

将图像的RGB像素数转换为样本数据

C++ OpenCV图像分割之如何实现高斯混合模型

通过EM方法对像素进行训练

C++ OpenCV图像分割之如何实现高斯混合模型

对每个像素标记颜色和显示

C++ OpenCV图像分割之如何实现高斯混合模型

打印出用的时间和显示最终图像

C++ OpenCV图像分割之如何实现高斯混合模型


我们来看一下运行后的结果

C++ OpenCV图像分割之如何实现高斯混合模型

因为高斯混合模型是通过EM进行数据训练进行分析的,所以对数据进行训练就需要耗时操作,下面就是我们得到上图结果所用到的时间,花了47秒多,相对来说是比较耗时的操作了。

C++ OpenCV图像分割之如何实现高斯混合模型

感谢你能够认真阅读完这篇文章,希望小编分享的“C++ OpenCV图像分割之如何实现高斯混合模型”这篇文章对大家有帮助,同时也希望大家多多支持亿速云,关注亿速云行业资讯频道,更多相关知识等着你来学习!

推荐阅读:
  1. opencv3/C++怎么实现视频背景去除建模
  2. opencv3/C++关于移动对象的轮廓的跟踪详解

免责声明:本站发布的内容(图片、视频和文字)以原创、转载和分享为主,文章观点不代表本网站立场,如果涉及侵权请联系站长邮箱:is@yisu.com进行举报,并提供相关证据,一经查实,将立刻删除涉嫌侵权内容。

c++ opencv

上一篇:如何理解xml,configpraser和hashlib模块

下一篇:C#如何实现基于Socket套接字的网络通信封装

相关阅读

您好,登录后才能下订单哦!

密码登录
登录注册
其他方式登录
点击 登录注册 即表示同意《亿速云用户服务条款》