数字图像处理成长之路15:前景提取(最大似然估计EM算法与高斯混合模型)

本文主要是介绍数字图像处理成长之路15:前景提取(最大似然估计EM算法与高斯混合模型),希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

先实践一下何为前景提取:
原始图像

这里写图片描述

这里写图片描述

如果画面中有移动的物体,会以白色表现出来。

这里写图片描述

我理解的前景提取就是把画面中移动的物体提取出来。

这里写图片描述

这是opencv中给的示意图,来简单看看opencv代码:

- 代码

// Global variables
Mat frame; //current frame
Mat fgMaskMOG2; //fg mask fg mask generated by MOG2 method
Ptr<BackgroundSubtractor> pMOG2; //MOG2 Background subtractormyOpencv::myOpencv()
{//create Background Subtractor objectspMOG2 = createBackgroundSubtractorMOG2(); //MOG2 approach
}cv::Mat myOpencv::BS(cv::Mat srcMat)
{pMOG2->apply(srcMat, fgMaskMOG2);return fgMaskMOG2;//返回值为二值图,白色代表前景
}

代码不多,下面来看看该算法的理论基础:
再来看看这幅图:

这里写图片描述

- 算法的猜测

如果最开始我们有一张静止的背景,并且背景始终保持不变,此时前景提取最为简单,即用带有前景的画面与背景做差即可。

现在让问题变得复杂些,实际上背景很少情况是保持不变的,比如上图左下角出现了第二艘船并停泊在那,这就导致勒背景的变化。而从这句话中我们似乎也能分析出,所谓背景就是在时间轴上很少变化的部分,是相对静止。所谓前景就是在时间轴上变化较频繁的部分。所以前景提取的算法应该和时间有关。

- 高斯分布

具体是怎样的关系,目前不得而知,回过头来看看opencv代码寻找线索。可以发现用了一个叫MOG的算法,查了一下,是混合高斯模型,网上也称之为GMM,混合高斯模型的出现又是为了解决什么样的问题呢?

先来回忆一下高斯分布,或者叫做正态分布。以一维为例,函数图像有中间高两边低,某点函数值的大小代表了该点出现的概率。高斯分布能很好的描述自然现象和社会现象的某些问题,比如一个地区男性成年人的身高,测量某零件长度的误差等。

但是某些问题是单一高斯分布或其他分布描述不了的,比如一张图片的归一化灰度直方图(横坐标代表像素强度,纵坐标代表同一强度的像素出现的频率),如果也简单画出它的曲线,可以想像会出现多个波峰。如果想借助数学工具对该图像进行拟合,显然超出了单一高斯分布的应用范围。

- 混合高斯模型

混合模型的出现正是为了解决类似上面的问题,所谓混合模型是把多个分布叠加在一起,从而可以更灵活的拟合数据。如果混合的分布是高斯分布,就称作高斯混合模型。

很容易想象把两个不同参数的高斯分布叠加在一起,就可以拟合拥有两个波峰的曲线。

混合模型中存在着一种思想,即用已知近似代替未知,用现有的构造没有的。这也是数学中常用到的思想,如以直代曲,如傅立叶变换。

在回到MOG算法,一般来说3-5个高斯分布叠加在一起就能达到很好的拟合效果。具体是几个不是重点,重点是,这些高斯分布的参数是不同的,如何确定它们的参数?

这就又涉及到参数估计的问题。

- 参数估计

本来只是想学习前景提取,可越学习遇到的问题越多,那就继续顺藤摸瓜,跟着这条主线下去,一探机器视觉的世界。

搜索高斯混合模型,出现概率比较高的是两个参数估计方法,即最大似然估计和EM。

- 最大似然估计(MLE,Maximum Likelihood Estimation)

这几个字看起来是那么的生硬难懂,让我们看看生活中的例子。

让我们看一个人的健康情况。口渴,多饮食,多尿,日渐消瘦,等症状往往预示着某种疾病。假如一个人只得口渴症状的概率是pa,多饮食的概率是pb,多尿的概率是pc,日渐消瘦的概率是pd。那么这些症状同时集中在一个人身上的概率是:paxpbxpcxpd,这个概率是联合概率。一个人神上的这些症状(数据)是可以观测的,然而引起这些症状的原因(参数)是不确定的。现在想来估计原因(参数),这个将要被估计的(原因)参数会使我们刚才观测的数据成立的可能性最大。一般来说得了糖尿病最有可能同时出现上述症状,于是我们判断这个人得了糖尿病(确定参数)。

这个例子并不是非常贴切,但是比较形象,有助于理解概念。

实际上,联合概率是值得关注的,这是最大似然估计常常出现的情况,由于是多项相乘,因此容易出现指数的形式,这也是为什么该算法会用到对数求导法,使指数形式变成对数相加,然后在求导进行下一步运算。

- EM算法

据说EM算法是机器学习十大算法之一,虽然我目前还未涉足机器学习,但也隐约感受到了EM算法的重要性,有必要把该算法弄懂。

要弄懂EM算法也并非易事,当我在网上搜索EM算法时,得到的结果大多是数学公式的罗列,真正的例子很少。

http://www.jianshu.com/p/1121509ac1dc 这个例子总算通俗易懂,然而要想真正的理解,需要我们自己动手推演一遍。

我们要进行抛硬币实验来计算硬币正面朝上的概率。也许你会说随着实验次数的增多,正面朝上的概率应该是0.5,在一般的情况下是这样的。

但是这个硬币和普通的不太一样,由于制造时出了差错或者硬币某一面粘了一小块异物,使得它的密度不是均匀分布的,中心也不是在硬币的几何中心的。因此抛在空中后也会出现不同以往的翻转效果,这可能导致其正面朝上的概率严重偏离0.5。

下面我们找来两个这样的硬币A,B来进行实验。A,B是两个同的硬币,分别对每个硬币做4组实验,每组抛5次。结果如下:

这里写图片描述

可以算出,A经过2组共10次实验之后计算正面朝上的概率是0.6,B是0.3。

下面做一下改变,假如刚开始抛硬币时只顾着记正反,错乱了抛硬币的顺序和抛的是哪个硬币,只知道每一组抛的是同一枚硬币,如何计算两个硬币正面朝上的概率?

这里写图片描述

这组图和上组图的区别仅在于并不知道一到四组硬币的顺序,这对我们来说的隐藏的条件,或者说有人故意把这个顺序藏起来不让你知道,来看看你到底有多聪明来找出这个顺序。

我们用向量Z来代表这一条件,Z=(Z1,Z2,Z3,Z4),现在只要求出Z中Z币的顺序就能求出两个硬币各自的朝上概率。

而情况是,只有我们知道了两个硬币朝上的概率,才能估计出这四组实验的顺序。

陷入了循环怪圈怎么办?我们可以先设定两个硬币的概率,然后用这个概率去估计Z的顺序,有了Z的顺序就回到了我们最开始那一过程,就可以重新计算出两个硬币的概率。然后比较一下我们设定的概率和新计算出的概率相差多少,如果相差不多说明我们已经找到了最有可能的情况,如果相差很大则需要继续估计。

下面假设A的概率是0.7,B的概率是0.6。如果第一组抛的硬币是A,则A抛出3正2反的概率是,0.7x0.7x0.7x(1-0.7)x(1-0.7)=0.03087。如果第一组是B,则B抛出3正2反的概率是0.6x0.6x0.6x(1-0.6)x(1-0.6)=0.03456。

此时如果用之前提到的最大似然估计法的话,第一组选择硬币B会最有可能出现3正2反的结果。

这里写图片描述

在每一组中,抛的硬币不是A就是B,是必然事件,概率是1,因此第一组抛的是A的概率是0.03087/(0.03087+0.03456)=0.47,是B的概率是1-0.47=0.53。依次列出其他组:

这里写图片描述

现在我们有些接近问题的解决了,即找到了隐变量Z相关的一些概率。

下面把A组的概率归一化:
这里写图片描述

于是这个问题可以换成这样的描述,从两个硬币中随机拿出一个,进行4组抛硬币实验,已知四组中选中硬币A的概率分别是如上图所示,抛硬币正反面结果如下图所示:

这里写图片描述

分别求硬币A正面朝上和反面朝上的期望。这是一个不难的期望计算问题,经过计算硬币A正面朝上的期望约是2.39,反面朝上的期望是2.61。下一步该计算什么了?从这两个期望就能够计算出硬币A正面朝上的概率是2.39/(2.39+2.61) 约等于0.49。同理可求B的概率。

上面就是EM算法的“E”了。

在得到A和B的新概率后,又可以回到上面重新计算,直到收敛了。

这就是EM算法的“M”了。

下图是网上一个外国人写的也可以做为参考。

这里写图片描述
这里写图片描述

至此,前景提取所需的理论基础大致介绍完毕,但说实话,仅仅介绍完这些仍无法使我理解高斯混合模型和前景提取究竟有什么关系,上述往往是从数学角度的理解,下面我要分析一下高斯模型和前景或者背景的关系。

- 背景的数学建模

为了简单起见,我们从单一高斯模型开始分析,看看它和背景的联系。

如果我们初次研究背景,就需要先研究背景的特征,正如最开始我的猜想,画面的某一点的像素值随时间不做变化或变化很小的应该认为是背景,或者虽然在短时间有巨大变化,但在大部分时间不变或者很少变化的是背景。

现在有这样一个视频片段,tree.avi,来自opencv数据文件夹。视频中有一棵树,基本是静止的,只是在风的作用下,来回小幅摆动。

这里写图片描述

在接近视频的结束时,一只手从视频右上角出现,滑动到中间又左上角划出。

这里写图片描述

视频的描述大致是如此。

选择一个固定点(x=5,y=5),其随时间的图像如下:

这里写图片描述

可以看到前50个点基本没有变化,在第15个点附近有小幅变化,应该是背景光线变化(树的摆动导致局部光线变化)所致,因为我确定这个点从始至终没有被手覆盖过,而第59点之后变化剧烈,因为大约在这个阶段,有一只手划过图像影响了整体光线。

前50个点是一个比较理想的背景实例。

再看下面这张图:

这里写图片描述

这张图是x=50,y=50点。可以看出该点在50点之前有小幅(幅度为5左右)变动,原因是这个点接近树叶,而树叶随风摆动。这个点也可以看作是一直处在背景上的点。

好了,下面我们分析最简单的那个点(5,5):

这里写图片描述

这个点随时间取得不同值可以看作是符合一维高斯模型,只是参数未知,该如何由已知的观测数据求出未知的参数?用最大似然估计法。

到此我们该把数学公式拿出来了。

假设该坐标点不同时间的像素值X1,X2…Xn,符合正太分布,则其似然函数为:

这里写图片描述

其对数似然函数为:

这里写图片描述

求偏导数组成似然方程:

这里写图片描述

解为:

这里写图片描述

至此就可以估计出点(5,5)随时间变化产生的数据所服从的高斯分布,其他点的同理。只不过在用程序实现时还需要考虑一些细节,这就因人而异了,懂了上述原理,理解其这些算法的程序实现上也容易很多。

上述为单一高斯分布,换成混合高斯分布就出现了隐蔽变量,就会用到EM算法。

至此前景提取所需要的大部分学习内容都已经有了分析,该算法的学习也可以先告一段落了。
(完)

这篇关于数字图像处理成长之路15:前景提取(最大似然估计EM算法与高斯混合模型)的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/1026008

相关文章

使用Python从PPT文档中提取图片和图片信息(如坐标、宽度和高度等)

《使用Python从PPT文档中提取图片和图片信息(如坐标、宽度和高度等)》PPT是一种高效的信息展示工具,广泛应用于教育、商务和设计等多个领域,PPT文档中常常包含丰富的图片内容,这些图片不仅提升了... 目录一、引言二、环境与工具三、python 提取PPT背景图片3.1 提取幻灯片背景图片3.2 提取

Python实现word文档内容智能提取以及合成

《Python实现word文档内容智能提取以及合成》这篇文章主要为大家详细介绍了如何使用Python实现从10个左右的docx文档中抽取内容,再调整语言风格后生成新的文档,感兴趣的小伙伴可以了解一下... 目录核心思路技术路径实现步骤阶段一:准备工作阶段二:内容提取 (python 脚本)阶段三:语言风格调

一文详解如何在Python中从字符串中提取部分内容

《一文详解如何在Python中从字符串中提取部分内容》:本文主要介绍如何在Python中从字符串中提取部分内容的相关资料,包括使用正则表达式、Pyparsing库、AST(抽象语法树)、字符串操作... 目录前言解决方案方法一:使用正则表达式方法二:使用 Pyparsing方法三:使用 AST方法四:使用字

openCV中KNN算法的实现

《openCV中KNN算法的实现》KNN算法是一种简单且常用的分类算法,本文主要介绍了openCV中KNN算法的实现,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的... 目录KNN算法流程使用OpenCV实现KNNOpenCV 是一个开源的跨平台计算机视觉库,它提供了各

Spring Security基于数据库的ABAC属性权限模型实战开发教程

《SpringSecurity基于数据库的ABAC属性权限模型实战开发教程》:本文主要介绍SpringSecurity基于数据库的ABAC属性权限模型实战开发教程,本文给大家介绍的非常详细,对大... 目录1. 前言2. 权限决策依据RBACABAC综合对比3. 数据库表结构说明4. 实战开始5. MyBA

springboot+dubbo实现时间轮算法

《springboot+dubbo实现时间轮算法》时间轮是一种高效利用线程资源进行批量化调度的算法,本文主要介绍了springboot+dubbo实现时间轮算法,文中通过示例代码介绍的非常详细,对大家... 目录前言一、参数说明二、具体实现1、HashedwheelTimer2、createWheel3、n

详解C#如何提取PDF文档中的图片

《详解C#如何提取PDF文档中的图片》提取图片可以将这些图像资源进行单独保存,方便后续在不同的项目中使用,下面我们就来看看如何使用C#通过代码从PDF文档中提取图片吧... 当 PDF 文件中包含有价值的图片,如艺术画作、设计素材、报告图表等,提取图片可以将这些图像资源进行单独保存,方便后续在不同的项目中使

Java的IO模型、Netty原理解析

《Java的IO模型、Netty原理解析》Java的I/O是以流的方式进行数据输入输出的,Java的类库涉及很多领域的IO内容:标准的输入输出,文件的操作、网络上的数据传输流、字符串流、对象流等,这篇... 目录1.什么是IO2.同步与异步、阻塞与非阻塞3.三种IO模型BIO(blocking I/O)NI

SpringBoot实现MD5加盐算法的示例代码

《SpringBoot实现MD5加盐算法的示例代码》加盐算法是一种用于增强密码安全性的技术,本文主要介绍了SpringBoot实现MD5加盐算法的示例代码,文中通过示例代码介绍的非常详细,对大家的学习... 目录一、什么是加盐算法二、如何实现加盐算法2.1 加盐算法代码实现2.2 注册页面中进行密码加盐2.

基于Flask框架添加多个AI模型的API并进行交互

《基于Flask框架添加多个AI模型的API并进行交互》:本文主要介绍如何基于Flask框架开发AI模型API管理系统,允许用户添加、删除不同AI模型的API密钥,感兴趣的可以了解下... 目录1. 概述2. 后端代码说明2.1 依赖库导入2.2 应用初始化2.3 API 存储字典2.4 路由函数2.5 应