OpenCV GrabCut 在 GC_INIT_WITH_MASK 模式下不更新掩码
OpenCV GrabCut doesn't update mask when on GC_INIT_WITH_MASK mode
我按照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
初始掩码:
图片:
谢谢!
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
我按照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
初始掩码:
图片:
谢谢!
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