grabcut图像分割的原理简单介绍
grabcut采用graph cut图分割和最大流技术的一种交互式图像分割技术,不吹牛逼了,接触opencv 10来天,就这点墨水了,直接言归正传,在学习了https://blog.csdn.net/zouxy09/article/details/8534954,大牛的文章后,有点感悟,所以记录下来,若有人看见了,就当做好玩的吧。
首先来介绍一下Graph cut ,图(graph)的分割模型图下图所示(大家肯定都见过了),以能量公式为基准,采用max flow算法,一次全局求解最小能量割边,能量公式为
E(L)=aR(L)+B(L)
S与各个像素点之间的虚线就是R(L),各像素点之间的实线是B(L),系数a是一个权重系数,决定了哪个因素影响更大一些。
区域项R(L)的计算方法如下所示,表示像素点lp归属于前景'obj'的概率Pr,或者归属于背景‘bkg’的概率Pr,同时为了采用最大流方法计算割边(cuts),所以负对数,这样得到的若该像素点归属于前景的概率越大,则Rp(1) 能量越小,符合最大流max flow算法理论(啥是最大流?),Graph cut 算法是根据该像素点(lp)灰度值,在前景和背景[这个前景和背景需要事先进行标记的,你需要提前告诉Graph,哪个是背景?哪个是前景]中的灰度值直方图所占的比例来计算前景和背景概率的,但是Grab cut是根据搞死混合模型来计算的(等会细讲)
Rp(1) = -ln Pr(Ip|’obj’); Rp(0) = -ln Pr(Ip|’bkg’)
边界项B(L)的计算方法:
这个是Graph cut的计算方法,比较简单,B 就是计算某个像素点lp与相邻像素点lq之间的(灰度值)得差异,lp-lq的值越大,两个像素之间的边越是应该是割边(cuts),B<p,q>的值越小,整体能量越小,符合最大流算法,在Grab cut 中,不是以灰度为基准,而是以BGR三通道衡量两像素的相似性,采用欧式距离(二范数)计算两个像素之间的差异。
最大流算法(max flow) 用于处理如何去切这个权值图(graph),切过之后累加得到能量E(L)值最小,切边(割边)就是上图中的黑线(各像素点之间的边)。
以上就是Graph cut的计算流程,Grab cut同样采用图框架理论,以及最大流算法求解割边,但是不同的是Grab cut 采用了BGR三通道(graph 是灰度图),在计算区域项R(L)时,采用了高斯混合模型。
///
grabcut的主要思路:(也只主要参考了上门面那位大牛的代码解释)
高斯混合模型,就是多个单高斯模型,如何评价一个像素集合呢?又如何判断某一个像素点属于该像素集合的概率呢?这时可以构建高斯模型来反映该像素集合的特征,在grabcut中,对应于前景和背景分别有5个高斯模型,例如若前景只有一个高斯模型,某个前景像素点lp在计算归属于前景的概率时,只有一种样本库模型,计算的归属概率有可能会很低,最后在最大流分割时,会被误判到背景里,所以有多个模型计算式,选取概率最大的一个,高斯模型越多,前景像素集的种类越多,越能够包容范围的像素点,过多的话计算量也会很大。
区域项R(L)的计算方法:
混合高斯概率计算公式如下:
这里面的x 是BGR三通道向量,如下所示:
B G R
第1个像素点p1 200 100 50
第2个像素点p2 220 110 60
第3个像素点p3 100 150 80
............
πi表示,第i个高斯模型的样本数量Ni在总的样本数量N里面的比值,
gi的是第i个高斯模型的概率模型公式,其中有两个参数,均值(ub,ug,ur)和协方差矩阵(协方差矩阵计算参照https://www.cnblogs.com/chaosimple/p/3182157.html),
这样一共有三个参数需要初始化(πi,均值u,协方差)
边界项B(L)的计算方法:
简单的说就是,计算相邻两个像素颜色之间的欧氏距离(B,G,R向量的二阶矩),可以参照源代码中的计算方法,一目了然
区域项反映的是,像素样本集合的整体特性,边界项反映的是两个像素之间的差异,一个这整体,一个是局部
具体流程用一幅图说明:
这样写真轻松,具体学习,可以通过这张图结合源代码,一定可以弄清楚的,有错误的地方,欢迎指出
grabcut图像分割的原理简单介绍相关推荐
- BP神经网络原理简单介绍以及公式推导(矩阵形式和分量形式)
BP神经网络原理简单介绍以及公式推导 标签(空格分隔): 神经网络 \def\net(#1){net^{(#1)}} \def\Y(#1){Y^{(#1)}} \def\part(#1){\parti ...
- LDAP服务器的概念和原理简单介绍
仅用于个人学习,侵删. 本文转自:LDAP服务器的概念和原理简单介绍 [http://seanlook.com/2015/01/15/openldap_introduction/] 1. 目录服务 目 ...
- CAS单点登录原理简单介绍
1. SSO简介 1.1 单点登录定义 单点登录(Single sign on),英文名称缩写SSO,SSO的意思就是在多系统的环境中,登录单方系统,就可以在不用再次登录的情况下访问相关受信任的系统. ...
- Android通过辅助功能实现抢微信红包原理简单介绍
简书文章:https://www.jianshu.com/p/e1099a94b979 附抢红包开源项目地址,代码已全改为Kotlin了,已适配到最新微信7.0.5版本,如果对你有所帮助赏个star吧 ...
- dubbo学习过程、使用经验分享及实现原理简单介绍
一.前言 部门去年年中开始各种改造,第一步是模块服务化,这边初选dubbo试用在一些非重要模块上,慢慢引入到一些稍微重要的功能上,半年时间,学习过程及线上使用遇到的些问题在此总结下. 整理这篇文章差不 ...
- dubbo学习过程、使用经验分享及实现原理简单介绍,dubbo经验分享
原文出处http://blog.csdn.net/hzzhoushaoyu/article/details/43273099 一.前言 部门去年年中开始各种改造,第一步是模块服务化,这边初选dubbo ...
- 日志管理(一):slf4j原理简单介绍
转载自:http://blog.sina.com.cn/s/blog_6f67b91d0100tpqh.html 全称:Simple Logging Facade for Java 简单日志门面(F ...
- GAN 数学原理简单介绍以及代码实践
1. GAN 数学原理 1.1 GAN 概述 GAN(Generative Adversarial Network) 是一种深度生成神经网络,它包括 生成模型 与 判别模型 两个部分.其中,生成模型 ...
- Binding的原理简单介绍
前言 开始写这个新系列,这些年用WPF做了很多项目,杂七杂八的东西写了不少,略略总结下,也希望能给朋友们带来点帮助. 本篇文章主要是自实现了一个BindingEngine,可以在WPF,WinForm ...
最新文章
- ASP.NET控件事件丢失的探究
- ide硬盘接口图 sata硬盘接口图 SCSI硬盘接口图
- js内存泄漏常见的四种情况(From LeuisKen)
- Mean Shift算法(CamShift)
- Left join后用and和where的区别
- mysql 搜索正则表达式_[MySQL] 用正则表达式进行搜索
- ubuntu和centos 编译安装nginx及常用命令
- python往redis导数_Python:教你一招,将500W+的数据快速写入redis(文内赋赠教程)...
- 山东大学网络教育计算机基础考试题,山东大学网络教育计算机网络基础期末考试复习...
- Git上传文件到GitHub失败问题解决
- 合成器插件Sylenth1 2.2.1绿化版亲测有效
- 错误: 找不到或无法加载主类 Main
- 计算机网络-域名与IP地址详解
- gson 解析int类型转换为double解决方案
- TypeError: Converting circular structure to JSON
- 增量学习方法分类及近两年论文汇总
- 流形上的预积分(上)
- 955不加班的公司名单:955.WLB
- Linux服务器系统有哪些?
- activiti的流程事件
热门文章
- 如何设计一个简单的KV数据库
- 分组卷积/转置卷积/空洞卷积/反卷积/可变形卷积/深度可分离卷积/DW卷积/Ghost卷积/
- 【学习笔记】山东大学生物信息学-05 高通量测序技术介绍 + 06 统计基础与序列算法(原理)
- 病原微生物高通量测序:第二节 应用场景
- 遥信量采集、显示及信息处理功能 遥测及数据处理功能
- Jedis实现批量删除redis cluster
- 如何使用【亿愿专利下载器】批量下载美国专利的PDF全文
- Python最新就业信息
- Gitee码云仓库操作步骤---忘了就来看看
- 基于Matlab软件的视觉导航系统的仿真