opencv3计算机视觉+Python(四)

使用分水岭和GrabCut算法进行物体分割

用GrabCut算法进行图像分割

在OpenCV中,实现了grabcut分割算法,该算法可以方便的分割出前景图像,操作简单,而且分割的效果很好。算法的原理参见papaer:“GrabCut” — Interactive Foreground Extraction using Iterated Graph Cuts

比如下面的一副图,我们只要选定一个四边形框,把框中的图像作为grabcut的一个输入参数,表示该框中的像素可能属于前景,但框外的部分一定属于背景。

GrabCut算法实现步骤为:

1.在图片中定义含有(一个或多个)物体的矩形

2.矩形外的区域被自动认为是背景

3.对于用户定义的矩形区域,可用背景中的数据来区别它里面的前景和背景区域

4.用高斯混合模型(GMM)来对背景和前景建模,并将未定义的像素标记为可能的前景或背景。

5.图像中的每一个像素都被看作通过虚拟边与周围像素相连接,而每条边都有一个属于前景或背景的概率,这基于它与周围像素颜色上的相似性。

6.每一个像素(即算法中的节点)会与一个前景或背景节点连接

7.在节点完成连接后(可能与背景或前景连接),若节点之间的边属于不同终端(即一个节点属于前景,另一个节点属于背景),则会切断它们之间的边(这就是算法名中的切割部分),这就能将图像各部分分割出来。

import numpy as np
import cv2
from matplotlib import pyplot as pltimg=cv2.imread('1.jpg')
mask=np.zeros(img.shape[:2],np.uint8)#创建一个掩模

#创建以0填充的前景和背景模型
bgdModel=np.zeros((1,65),np.float64)
fgdModel=np.zeros((1,65),np.float64)rect=(100,160,400,670)#创建矩形
cv2.grabCut(img,mask,rect,bgdModel,fgdModel,5,cv2.GC_INIT_WITH_RECT)#使用了指定的空模型和掩模来运行GrabCut,并且实际上是用一个矩形来初始化这个操作
#做完这些后,我们的掩模已经变成包含0~3之间的值。值为0和2的将转为0,值为1,3的将转为1.然后保存在mask2中。这样就可以用mask2过滤出所有的0值像素(理论上会完整保留所有前景像素)
mask2=np.where((mask==0)|(mask==2),0,1).astype('uint8')
img=img*mask2[:,:,np.newaxis]plt.subplot(121),plt.imshow(img)
plt.title("grabcut"),plt.xticks([]),plt.yticks([])
plt.subplot(122),plt.imshow(cv2.cvtColor(cv2.imread("1.jpg"),cv2.COLOR_BGR2RGB))
plt.title("original"),plt.xticks([]),plt.yticks([])
plt.show()


使用分水岭算法进行图像分割

把图像中的低密度的区域(变化很少)想象成山谷,图像中高密度的区域(变化很多)想象成山峰。开始向山谷中注入水直到不同的山谷中的水开始汇聚。为了阻止不同山谷的水汇聚,可以设置一些栅栏,最后得到的栅栏就是图像分割。

转载于:https://www.cnblogs.com/yifdu25/p/8445471.html

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:https://dhexx.cn/news/show-18139.html

如若内容造成侵权/违法违规/事实不符,请联系我的编程经验分享网进行投诉反馈,一经查实,立即删除!


相关文章:

  • 前端学习---移动端vue开发踩坑记
  • 【简单】Linux 搭建 UOJ
  • C - Copying Books (POJ - 1505)
  • LeetCode之SQL练习:第二高薪
  • Codeforces.100633J.Ceizenpok's formula(扩展Lucas)
  • 视觉SLAM算法框架解析(3) SVO
  • 80.共享内存实现进程通信
  • 7-19 求链式线性表的倒数第K项
  • python web框架【补充】自定义web框架
  • 成长的话
  • js判断移动端或是pc端
  • 【记录】C++中的位域
  • 使用vscode比较两个文件的差别
  • 【mysql】mysql常用语句
  • My97DatePicker 演示和文档
  • plus初始化原理及plus is not defined,mui is not defined 错误汇总
  • bzoj千题计划254:bzoj2286: [Sdoi2011]消耗战
  • linux UVC and hardware viewer
  • IEEP-网络实施-项目交付流程
  • 在C#中使用SQL语句什么情况需要使用‘单引号’和“双引号”
  • (转)DB2 db2diag.log 日志分析
  • Python学习笔记_Day4_集合
  • Node.js的require()的工作原理
  • Mybaits的运行原
  • Intellij IDEA 使用jrebel运行spring-boot并实现自动编译进行热部署
  • Thymeleaf 随记
  • WebStorm中配置node.js(Windows)
  • 33-高级特性之generator(1)
  • Thread.Sleep()
  • c语言数组的概念和指针的加减使用
  • JMeter 连接 sql server
  • JS高级程序随笔一
  • 入门系列3
  • python支持中文注释
  • BZOJ4598 [Sdoi2016]模式字符串 【点分治 + hash】
  • 【bzoj4897】[Thu Summer Camp2016]成绩单 区间dp
  • 从零开始学习前端JAVASCRIPT — 14、闭包与继承
  • 设置Emeditor为Python的简易开发工具
  • echarts改变颜色属性的demo
  • Httpd总结 :HTTPD的基本概念
  • 图 Graph-图的相关算法
  • 【收集资料】OpenGL学习
  • openpyxl 2.5.0中文文档
  • 20172324《程序设计与数据结构》第一周学习总结
  • iOS webview 清除缓存
  • Java EE脑图
  • 列表和元组的操作
  • UML建模:学习笔记(1)
  • Python_三级菜单
  • PHP7 学习笔记(十二)gRPC