Удаление тривиального фона с помощью GrabCut - PullRequest
1 голос
/ 10 июля 2019

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

enter image description here

GrabCut дает:

enter image description here

А вот и мой код:

img = cv2.imread('test.jpg')

mask = np.zeros(img.shape[:2], np.uint8)

bgdModel = np.zeros((1,65),np.float64)
fgdModel = np.zeros((1,65),np.float64)

height, width, _ = img.shape

rect = (int(width * 0.05), 0, height, int(width * 0.9))

cv2.grabCut(img, mask, rect, bgdModel, fgdModel, 5, cv2.GC_INIT_WITH_RECT)

mask2 = np.where((mask==2)|(mask==0),0,1).astype('uint8')
img = img*mask2[:,:,np.newaxis]

plt.imshow(img),plt.colorbar(),plt.show()

На самом деле я пытаюсь подражать Волшебной палочке Фотошопа, которая бы легко выделяла белый фон.Кто-нибудь знает хороший способ использования opencv?Есть ли способ настроить GrabCut, чтобы сделать подобное?

ОБНОВЛЕНИЕ: После исправления прямоугольника я получаю маску, которая оставляет пробел:

enter image description here

1 Ответ

1 голос
/ 10 июля 2019
rect = (int(width * 0.05), 0, height, int(width * 0.9))

присмотрись. у вас есть что-то пропорциональное ширине в 1-й и 4-й позиции. это, вероятно, неправильно. элементы (x, y, w, h) .

Кроме того, вы основываете свое наблюдение на фальшивом цветном рисунке matplotlib. может быть, он нарисовал истинные цвета.

...