【问题标题】:OpenCV GrabCut doesn't update mask when on GC_INIT_WITH_MASK modeOpenCV GrabCut 在 GC_INIT_WITH_MASK 模式下不更新掩码
【发布时间】:2019-05-22 01:57:55
【问题描述】:

我关注this opencv tutorial 并使用自己的图像和掩码通过opencv 抓取算法改进分割,但结果掩码与初始掩码相同。

代码:

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

初始掩码:

图片:

谢谢!

【问题讨论】:

    标签: python opencv computer-vision semantic-segmentation


    【解决方案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
    

    【讨论】:

      猜你喜欢
      • 2018-03-31
      • 1970-01-01
      • 1970-01-01
      • 2014-07-17
      • 2017-07-17
      • 2017-12-25
      • 1970-01-01
      • 2020-07-06
      • 1970-01-01
      相关资源
      最近更新 更多