数字图像处理成长之路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

相关文章

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 应

Java时间轮调度算法的代码实现

《Java时间轮调度算法的代码实现》时间轮是一种高效的定时调度算法,主要用于管理延时任务或周期性任务,它通过一个环形数组(时间轮)和指针来实现,将大量定时任务分摊到固定的时间槽中,极大地降低了时间复杂... 目录1、简述2、时间轮的原理3. 时间轮的实现步骤3.1 定义时间槽3.2 定义时间轮3.3 使用时

Python实现常用文本内容提取

《Python实现常用文本内容提取》在日常工作和学习中,我们经常需要从PDF、Word文档中提取文本,本文将介绍如何使用Python编写一个文本内容提取工具,有需要的小伙伴可以参考下... 目录一、引言二、文本内容提取的原理三、文本内容提取的设计四、文本内容提取的实现五、完整代码示例一、引言在日常工作和学

C++字符串提取和分割的多种方法

《C++字符串提取和分割的多种方法》在C++编程中,字符串处理是一个常见的任务,尤其是在需要从字符串中提取特定数据时,本文将详细探讨如何使用C++标准库中的工具来提取和分割字符串,并分析不同方法的适用... 目录1. 字符串提取的基本方法1.1 使用 std::istringstream 和 >> 操作符示

基于Python开发批量提取Excel图片的小工具

《基于Python开发批量提取Excel图片的小工具》这篇文章主要为大家详细介绍了如何使用Python中的openpyxl库开发一个小工具,可以实现批量提取Excel图片,有需要的小伙伴可以参考一下... 目前有一个需求,就是批量读取当前目录下所有文件夹里的Excel文件,去获取出Excel文件中的图片,并

详解如何使用Python提取视频文件中的音频

《详解如何使用Python提取视频文件中的音频》在多媒体处理中,有时我们需要从视频文件中提取音频,本文为大家整理了几种使用Python编程语言提取视频文件中的音频的方法,大家可以根据需要进行选择... 目录引言代码部分方法扩展引言在多媒体处理中,有时我们需要从视频文件中提取音频,以便进一步处理或分析。本文

如何通过Golang的container/list实现LRU缓存算法

《如何通过Golang的container/list实现LRU缓存算法》文章介绍了Go语言中container/list包实现的双向链表,并探讨了如何使用链表实现LRU缓存,LRU缓存通过维护一个双向... 目录力扣:146. LRU 缓存主要结构 List 和 Element常用方法1. 初始化链表2.

基于Python实现一个PDF特殊字体提取工具

《基于Python实现一个PDF特殊字体提取工具》在PDF文档处理场景中,我们常常需要针对特定格式的文本内容进行提取分析,本文介绍的PDF特殊字体提取器是一款基于Python开发的桌面应用程序感兴趣的... 目录一、应用背景与功能概述二、技术架构与核心组件2.1 技术选型2.2 系统架构三、核心功能实现解析