python - OpenCV GrabCut 在 GC_INIT_WITH_MASK 模式下不更新掩码

标签 python opencv computer-vision semantic-segmentation

我关注了this opencv tutorial并使用我自己的图像和掩码使用 opencv grabcut 算法改进分割,但生成的掩码与初始掩码相同。

代码:

import cv2

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

mask = np.zeros(image.shape[:2],np.uint8)
mask[init_mask == 255] = 1

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

np.all(mask==init_mask) # True

初始掩码:

enter image description here

图片:

enter image description here

谢谢!

最佳答案

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

关于python - OpenCV GrabCut 在 GC_INIT_WITH_MASK 模式下不更新掩码,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/53887425/

相关文章:

android - 对 `cv::fastFree(void*)' 的 undefined reference

opencv - 基于BackgroundSubtractorMOG的车辆计数

computer-vision - 从航拍图像绘制房屋轮廓

python - 避免在 Django 应用程序中导入循环模型

python - RPi3 中的 cv2.VideoWriter 比实际快

opencv - 使用分水岭算法计算对象数量 - Scikit-image

opencv - 拆分和合并分段

python - 选择与随机播放,Python

python - Qpixmap 图像未在 pyqt4 4.9 python 中加载

python - Pandas 数据框中列的热图