前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >OpenCV 图像分割之grabCut算法

OpenCV 图像分割之grabCut算法

作者头像
用户6021899
发布2019-09-17 16:32:29
3.3K0
发布2019-09-17 16:32:29
举报
文章被收录于专栏:Python编程 pyqt matplotlib

GrabCut算法的原理涉及到以下知识:

  • K均值聚类
  • 高斯混合模型建模(GMM)
  • max flow/min cut

GrabCut算法的实现步骤:

  1. 在图片中定义(一个或者多个)包含物体的矩形。
  2. 矩形外的区域被自动认为是背景。
  3. 对于用户定义的矩形区域,可用背景中的数据来区分它里面的前景和背景区域。
  4. 用高斯混合模型(GMM)来对背景和前景建模,并将未定义的像素标记为可能的前景或者背景。
  5. 图像中的每一个像素都被看做通过虚拟边与周围像素相连接,而每条边都有一个属于前景或者背景的概率,这是基于它与周边像素颜色上的相似性。
  6. 每一个像素(即算法中的节点)会与一个前景或背景节点连接。
  7. 在节点完成连接后(可能与背景或前景连接),若节点之间的边属于不同终端(即一个节点属于前景,另一个节点属于背景),则会切断他们之间的边,这就能将图像各部分分割出来。下图能很好的说明该算法:

示例代码如下:

代码语言:javascript
复制
import cv2
import numpy as np
from matplotlib import pyplot as plt

img = cv2.imread("2.jpg")

mask = np.zeros(img.shape[:2], np.uint8)
bgdModel = np.zeros((1,65), np.float64) #以0填充的背景
fgdModel = np.zeros((1,65), np.float64)#以0填充的前景
#rect = (100,10,300,300)
rect = (1,1, 600, 430)
#grabCut(img, mask, rect, bgdModel, fgdModel, iterCount[, mode]) -> mask, bgdModel, fgdModel
cv2.grabCut(img, mask, rect, bgdModel, fgdModel, 6, cv2.GC_INIT_WITH_RECT)
#做完这些我们的掩码已经变成包含0~3的值

#将掩码中0或2 转为0(背景), 其它(1或3)转为1(前景)
mask2 = np.where((mask==2)|(mask ==0), 0, 1).astype(np.uint8)
img1 = img*mask2[:,:, np.newaxis]#分割后的前景

plt.subplot(121)
plt.imshow(cv2.cvtColor(img1, cv2.COLOR_BGR2RGB))#BGR模式 转RGB 模式
plt.title("grabcut")
plt.xticks([]); plt.yticks([]) #不显示坐标轴刻度
plt.subplot(122)
plt.imshow(cv2.cvtColor(img, cv2.COLOR_BGR2RGB))
plt.title("original")
plt.xticks([]); plt.yticks([])#不显示坐标轴刻度
plt.show()

分割效果见下图:

本文参与 腾讯云自媒体同步曝光计划,分享自微信公众号。
原始发表:2019-09-15,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 Python可视化编程机器学习OpenCV 微信公众号,前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体同步曝光计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档