Я пытался использовать функцию 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, получаю аналогичные результаты с реальными изображениями.
