OpenCV GrabCut не обновляет маску в режиме GC_INIT_WITH_MASK - PullRequest
0 голосов
/ 21 декабря 2018

Я следовал этому руководству по opencv и использовал свое собственное изображение и маску для улучшения сегментации с использованием алгоритма захвата 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

Начальная маска:

enter image description here

Изображение:

enter image description here

Спасибо!

1 Ответ

0 голосов
/ 22 декабря 2018

Маска для 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

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...