grabcut算法matlab代码_Day250:OpenCV图像处理-Grabcut图像分割
·
概述
✔️ Grabcut是基于图割(graph cut)实现的图像分割算法,用户输入一个bounding box作为分割目标位置,实现目标与背景的分离/分割。
✔️ Grabcut分割速度快,效果好,支持交互操作,因此在很多APP图像分割/背景虚化的软件中经常使用。
算法流程
- 在图片中定义含有(一个或多个)物体的矩形;
- 矩形外的区域被自动认为是背景;
- 对于用户定义的矩形区域,可以使用背景中的数据来区分矩形内的区域是前景还是背景;
- 用高斯混合模型(GMM)来对背景和前景进行建模,并将未定义的像素标记为可能的前景或背景
- 图像中的每一个像素都被看做通过虚拟边与周围像素相连接,而每条边都有一个属于前景和背景 的概率,这基于他与周围像素颜色上的相似性
- 每一个像素(即算法中的节点)会与一个前景和背景节点连接。这与下图类似:

- 在节点完成连接后(可能与背景或前景连接),若节点之间的边属于不同的终端(一个属于背景,一个输入前景),则会切断他们之间的边,这就将图像的各个部分分割出来,下图能够很好的说明算法:

函数
cv2.grabCut(img, rect, mask,bgdModel, fgdModel, iterCount, mode = GC_EVAL)其中:
- img --> 输入的三通道图像;
- mask --> 输入的单通道图像,初始化方式为GC_INIT_WITH_RECT表示ROI区域可以被初始化为:
- GC_BGD --> 定义为明显的背景像素 0
- GC_FGD --> 定义为明显的前景像素 1
- GC_PR_BGD --> 定义为可能的背景像素 2
- GC_PR_FGD --> 定义为可能的前景像素 3
- rect --> 表示roi的区域,即存在着要分割物体的部分,包括前景的矩形,格式为(x,y,w,h)
- bgdModel --> 表示临时背景模型数组;
- fgdModel --> 表示临时前景模型数组;
- iterCount --> 表示图割算法迭代次数, 次数越多,效果越好;
- mode --> 当使用用户提供的roi时候使用GC_INIT_WITH_RECT。
代码
import cv2import numpy as npfrom matplotlib import pyplot as plt img = cv2.imread("../images/13.jpg")gray = cv2.cvtColor(img,cv2.COLOR_BGR2GRAY)# 创建于读入图像,相同大小的掩模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,50,421,378)# 需要手动给出包含前景的矩形区域cv2.grabCut(img, mask, rect, bgdModel,fgdModel,6,cv2.GC_INIT_WITH_RECT) # 此时的掩模已经变成了0-3之间的数字,mask2 = np.where((mask == 2) | (mask == 0),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(gray)plt.title("original"),plt.xticks([]),plt.yticks([]) plt.show()下面的示例代码主要有这几步:
- 加载想要处理的图像,然后创建一个与图像大小相同的掩模,并用0填充。
- 创建以0填充的前景和背景模型。
- 准备一个标识出想要隔离的对象的矩形来初始化GrabCut算法。
- 使用指定的空模型和掩模来运行GrabCut算法。
- cv2.grabCut()的第六个参数是算法迭代的次数,执行完算法之后,掩模已经变成了包含0~3的值,其中值为0和2的为背景,值为1和3的为前景。
- 使用matplotlib来并排展示处理前后的图像。

参考1:https://blog.csdn.net/qq_39384184/article/details/83188820
参考2:https://blog.csdn.net/qq_44669578/article/details/102627260
DAMO开发者矩阵,由阿里巴巴达摩院和中国互联网协会联合发起,致力于探讨最前沿的技术趋势与应用成果,搭建高质量的交流与分享平台,推动技术创新与产业应用链接,围绕“人工智能与新型计算”构建开放共享的开发者生态。
更多推荐



所有评论(0)