在GC_INIT_WITH_MASK模式下,OpenCV GrabCut不会更新遮罩

时间:2018-12-21 15:38:48

标签: python opencv computer-vision semantic-segmentation

我遵循了this opencv tutorial,并使用自己的图像和遮罩使用opencv抓取算法改善了分割效果,但是生成的遮罩与初始遮罩相同。

代码:

Maybe Int

初始蒙版:

enter image description here

图片:

enter image description here

谢谢!

1 个答案:

答案 0 :(得分:1)

cv2.grabCut的遮罩可以采用四个值:

  • 0:地面真相背景
  • 1:地面真相前景
  • 2:可能的背景
  • 3:可能的前景

已记录在here中。

在您的情况下,它什么也不做,因为掩码只有零和一,所以您要告诉函数您确定当前的分段。如果将遮罩图像的其余部分设置为2,它将适合该背景模型,并且算法可以运行。

如果愿意,您仍然可以将某些像素设置为真实背景。

import cv2

init_mask = cv2.imread('mask.png',0)
img = cv2.imread('image.png')

mask = np.zeros(img.shape[:2],np.uint8)
mask[init_mask == 255] = 1
mask[init_mask == 0] = 2 #Guess everything else is background

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

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')
mask[mask == 1] = 255

Result of running my code