利用OpenCV的Grabcut()函数实现图像的前景与背景的分割-并对Grabcut()作详细介绍
来源:互联网 发布:怎么复制汇总数据 编辑:程序博客网 时间:2024/06/02 14:30
Graphcut是一种基于图论的分割方法,在计算机视觉领域中应用于前景分割、医学处理、纹理分割及立体视觉等方面,类似于PS中的抠图功能。基本图论的分割技术是图像分割领域中新的研究热点,该方法基于能量优化算法,将图像分割问题转换为图的最小割优化问题。
Grabcut是Graphcut算法的改进,Graphcut是一种直接基于图切算法的图像分割技术,仅仅需要确认前景与背景输入,该算法就可以完成背景与前景相似督导赋权图,并通过最优切割来实现图像分割。Grabcut算法可以不需要用户交互,仅仅需要输入包含目标前景的区域就可以完成前景与前景的分离。
Graphcut的目标和背景模型是灰度直方图,Grabcut采用的是RGB三通道混合高斯模型;Graphcut的能量最小化分割是能通过一次计算实现的,而Grabcut是根据分割模型参数更新完成学的学习过程;Graphcut需要用户输入前景与背景区域点集,而Grabcut只需要提供含有背景的区域像素集就可以完成分割。
上面三段话纯属装逼,实际上,只是对Grabcut算法和Graphcut算法大致的介绍,要说为什么是那样,我现在也说不清楚,如果想了解详细原理,可以参考相关论文和下面这三篇博文
http://blog.csdn.net/zouxy09/article/details/8532106
http://blog.csdn.net/zouxy09/article/details/8532111
http://blog.csdn.net/zouxy09/article/details/8534954
OpenCV中提供了Grabcut函数用于实现Grabcut操作,原型如下:
void grabCut(InputArray image, InputOutputArray mask, Rect rect, InputOutputArray bgdModel, InputOutputArray fgdModel, int iterCount, int mode)
下面介绍各参数的含义:
image-输入图像,要求是三通道的图像
mask-如果mode参数的模式设为GC_INIT_WITH_RECT,那么mask和算法的初始状态由第三个参数rect来初始化;如果mode参数的模式设为GC_INIT_WITH_MASK ,那么这个mask由用户自定义,并由这个自定义的mask初始化算法。mask每个像素的值有以下几种取值:
GC_BGD-背景像素,宏定义的值为0
GC_FGD -前景像素,宏义义的值为1
GC_PR_BGD-比较可能为背景像素的像素,宏义义的值为2
GC_PR_FGD-比较可能为前景像素的像素,宏义义的值为3
rect:被用户指定含前景的矩形区域,如果mode设为GC_INIT_WITH_RECT,那么在使用rect对mask进行初始化时,rect区域之外的值统一为0
bgdModel:迭代时使用的背景临时阵列
fgdModel: 迭代时使用的前景临时阵列
iterCount:算法迭代次数,迭代次数越多,显然越耗时间,但是对前景和背景的分割也越准
mode:算法模式设置,有三个取值,GC_INIT_WITH_RECT和GC_INIT_WITH_MASK已经在上面讲解了,还有一个值是GC_EVAL ,如果设置为GC_EVAL ,那么算法将无视mask的影响,直接执行算法。
下面上代码(代码中用到的图像的下载链接:https://pan.baidu.com/s/1dEEP10t):
//OpenCV版本3.0.0 //交流QQ2487872782 2016-8-4注:很报歉,此代码目前不能公开发表在博客上,已经删除,希望大家能理解!
运行结果如下图所示:
-------------------------------------------
欢迎大家加入图像识别技术交流群:271891601,另外,特别欢迎成都从事图像识别工作的朋友交流,我的QQ号2487872782
- 利用OpenCV的Grabcut()函数实现图像的前景与背景的分割-并对Grabcut()作详细介绍
- OpenCV3.0 Examples学习笔记(10)-grabcut.cpp-grabcut函数实现人机交互高效分割图像前景背景
- 图像分割之(五)OpenCV的GrabCut调用
- [OpenCV]图像分割之(四)OpenCV的GrabCut函数使用和源码解读
- 图像分割之(四)OpenCV的GrabCut函数使用和源码解读
- 图像分割之(四)OpenCV的GrabCut函数使用和源码解读
- 图像分割之(四)OpenCV的GrabCut函数使用和源码解读
- 图像分割之(四)OpenCV的GrabCut函数使用和源码解读
- 图像分割之(四)OpenCV的GrabCut函数使用和源码解读
- 图像分割之(四)OpenCV的GrabCut函数使用和源码解读
- 图像分割之(四)OpenCV的GrabCut函数使用和源码解读
- 图像分割之(四)OpenCV的GrabCut函数使用和源码解读
- 图像分割之(四)OpenCV的GrabCut函数使用和源码解读
- 图像分割之(四)OpenCV的GrabCut函数使用和源码解读
- 图像分割之(四)OpenCV的GrabCut函数使用和源码解读
- OpenCV图像分割cv::grabCut()函数
- GrabCut in One Cut(基于图割算法grabcut的一次快速图像分割的OpenCV实现)----目前效果最好的图割
- 【图像识别】GrabCut的Android实现
- JMeter-负载测试
- PAT-B 1046. 划拳
- 求LPS——最长回文子序列
- .NET把小写数字金额转换成大写人民币金额的两种算法
- Trimmomatic对raw reads的去接头 赫尔过滤
- 利用OpenCV的Grabcut()函数实现图像的前景与背景的分割-并对Grabcut()作详细介绍
- Linux上面用QCreator搭载opencv工程的创建
- [hdu 4405] Aeroplane chess [概率DP & 期望]
- JUnit教程-- 创建套件测试
- 简单算法集合
- 《挑战程序设计竞赛》164页 区域个数
- hdu 5666
- 总结SQLite不支持的SQL语法有哪些
- 初学菜单(3种)和菜单管理(菜单管理机制,添加菜单,菜单监听)