opencv-GrabCut算法交互式前景提取

opencv-GrabCut算法交互式前景提取

OpenCV 提供了函数:cv2.grabCut()。下面为它的参数:
• img - 输入图像
• mask-掩模图像,用来确定那些区域是背景,前景,可能是前景/背景等。可以设置为:cv2.GC_BGD,cv2.GC_FGD,cv2.GC_PR_BGD,cv2.GC_PR_FGD,或者直接输入 0,1,2,3 也行。
• rect - 包含前景的矩形,格式为 (x,y,w,h)
• bdgModel, fgdModel - 算法内部使用的数组. 你只需要创建两个大小为 (1,65),数据类型为 np.float64 的数组。
• iterCount - 算法的迭代次数
• mode 可以设置为 cv2.GC_INIT_WITH_RECT 或 cv2.GC_INIT_WITH_MASK,也可以联合使用。这是用来确定我们进行修改的方式,矩形模式或者掩模模式 。

矩阵模式:

我们加载图像,创建一个类似的掩码图像。 我们创建fgdModel和bgdModel。 我们给出矩形参数。 这一切都是直截了当的。 让算法运行5次迭代。 模式应该是cv2.GC_INIT_WITH_RECT,因为我们使用矩形。 然后运行grabcut。 它修改掩模图像。 在新的mask图像中,像素将被标记为四个标志,表示如上所述的背景/前景。 所以我们修改掩码,使得所有的0像素和2像素都被置于0(即背景),所有的1像素和3像素被放到1(即前景像素)。 现在我们的最后面具准备好了。 只需将其与输入图像相乘即可获取分割图像。
代码如下:

 import numpy as np
import cv2
from matplotlib import pyplot as plt

img = cv2.imread('messi5.jpg')
mask = np.zeros(img.shape[:2],np.uint8)

bgdModel = np.zeros((1,65),np.float64)
fgdModel = np.zeros((1,65),np.float64)

rect = (50,50,450,290)
cv2.grabCut(img,mask,rect,bgdModel,fgdModel,5,cv2.GC_INIT_WITH_RECT)

mask2 = np.where((mask==2)|(mask==0),0,1).astype('uint8')
img = img*mask2[:,:,np.newaxis]

plt.imshow(img),plt.colorbar(),plt.show()

对于识别有误的地方:
我们使用图像编辑软件打开输入图像,添加一个图层,使用笔刷工具在需要的地方使用白色绘制(比如头发,鞋子,球等);使用黑色笔刷在不需要的地方绘制(比如, logo,草地等)。然后将其他地方用灰色填充,保存成新的掩码图像。在 OpenCV 中导入这个掩模图像,根据新的掩码图像对原来的掩模图像进行编辑。
代码如下:

newmask = cv2.imread('newmask.jpg',0)
mask[newmask == 0] = 0
mask[newmask == 255] = 1
mask,bgdModel,fgdModel = cv2.grabCut(img, mask, None, bgdModel, fgdModel, 5, cv2.GC_INIT_WITH_MASK)
mask = np.where((mask ==2)|(mask ==0),0,1).astype('uint8') 

同时也可以不使用矩形初始化,直接进入掩码图像模式。使用 2像素和 3 像素(可能是背景/前景)对矩形区域的像素进行标记。然后象我们在第二个例子中那样对肯定是前景的像素标记为 1 像素。然后直接在掩模图像模式下使用 grabCut 函数。

参考文章

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值