Неожиданный результат с использованием функции grabcut opencv3 в python

Я пытался использовать функцию cv2.grabcut с python 3.5 - я использую cv2.GC_INIT_WITH_MASK в качестве метода инициации, но результаты кажутся странными, а маска вывода не такая, как я ожидал.

import cv2 import numpy as np import matplotlib.pyplot as plt # img = np.zeros((200,200, 3), 'uint8') mask = np.zeros((200,200), 'uint8') cv2.circle(img, (100,100), 50, (255,255,255), -1); cv2.circle(mask, (100,100), 5, 1, -1) # bgdModel = np.zeros((1,65),np.float64) fgdModel = np.zeros((1,65),np.float64) out_mask, out_bgdModel, out_fgdModel = cv2.grabCut(img, mask, None, bgdModel, fgdModel, 5, cv2.GC_INIT_WITH_MASK) # print('opencv', cv2.version) # opencv 3.1.0 # fig,ax = plt.subplots(1,3) ax[0].imshow(img) ax[1].imshow(mask) ax2.imshow(out_mask) plt.show()

Пример

Несмотря на то, что маска инициируется в центре данного круга, она не захватывает полную форму, а придерживается исходной формы маски. Увеличение количества итераций не помогло.

p.s Я использовал это как exmpale, получаю аналогичные результаты с реальными изображениями.


person shahar_m    schedule 20.06.2018    source источник


Ответы (1)


arrow_upward
0
arrow_downward

Мне нужно было инициировать маску как перечисления захвата. Следующее исправление работает.

mask = np.full((200,200),cv2.GC_PR_BGD,np.uint8)
cv2.circle(mask, (100,100),  5,  int(cv2.GC_PR_FGD),  -1)

out_mask, _, _ = cv2.grabCut(img, mask, None, bgdModel, fgdModel, 5, cv2.GC_INIT_WITH_MASK)
person shahar_m    schedule 20.06.2018