Маска для cv2.grabCut
может принимать четыре значения:
- 0: фон истинности земли
- 1: фон правды земли
- 2: фон вероятности
- 3: Вероятный передний план
Это задокументировано здесь .
В вашем случае ничего не происходит, потому что маска только ноль и единица,так что вы говорите функции, вы уверены в текущей сегментации.Если вы установите для остальной части изображения маски значение 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](https://i.stack.imgur.com/yg0s5.png)