使用GrabCut删除琐碎的背景

时间:2019-07-10 15:02:18

标签: opencv opencv3.0

我正在尝试从几张背景趋于白色的图像中删除相对琐碎的背景。但是,即使遮罩包含的白色不多,生成的遮罩也会与前景重叠。例如,给定以下输入:

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()

我实际上是在尝试模仿Photoshop的魔术棒,该魔术棒很容易挑选出白色背景。有人知道使用opencv的好方法吗?有没有办法调整GrabCut做类似的事情?

更新:修复矩形之后,我现在得到的是一个留有空隙的蒙版:

enter image description here

1 个答案:

答案 0 :(得分:1)

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

仔细观察。在第1和第4位,您的宽度与宽度成比例。那可能是错误的。 the elements are (x,y,w,h)

此外,您还可以根据matplotlib的假彩色图形进行观察。也许可以绘制出真实的颜色。