在这篇Python OpenCV文章中,我们将讨论使用GrabCut算法实现前景检测。GrabCut算法由英国剑桥微软研究院的Carsten Rother,Vladimir Kolmogorov和Andrew Blake设计。
下面的代码是Python OpenCV GrabCut前景检测的完整代码
import numpy as np
import cv2
from matplotlib import pyplot as plt
img = cv2.imread(www.linuxmi.com.jpg')
mask = np.zeros(img.shape[:2],np.uint8)
bgdModel = np.zeros((1,65),np.float64)
fgdModel = np.zeros((1,65),np.float64)
rect = (100, 10, 621, 578)
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.subplot(121), plt.imshow(img)
plt.title("grabcut"), plt.xticks([]), plt.yticks([])
plt.subplot(122),
plt.imshow(cv2.cvtColor(cv2.imread(www.linuxmi.com.jpg'),
cv2.COLOR_BGR2RGB))
plt.title("original"), plt.xticks([]), plt.yticks([])
plt.show()
现在,在上面的代码中,我们创建了以0填充模型以及前景和背景模型。
bgdModel = np.zeros((1,65),np.float64)
fgdModel = np.zeros((1,65),np.float64)
将基于初始矩形之外的区域确定背景和前景模型
这是定义一个矩形代码
rect = (100, 10, 621, 578)
下面我们运行GrabCut算法,指定空模型和蒙版,并使用矩形来初始化操作:
cv2.grabCut(img,mask,rect,bgdModel,fgdModel,5,cv2.GC_INIT_WITH_RECT)
一些参数说明:
- img: 输入图像
- mask: 蒙板图像,确定前景区域,背景区域,不确定区域。也可以设置为cv2.GC_BGD,cv2.GC_FGD,cv2.GC_PR_BGD,cv2.GC_PR_FGD,也可以输入0,1,2,3
- rect 前景的矩形,格式为(x,y,w,h),分别为左上角坐标和宽度,高度
- bdgModel, fgdModel 算法内部是用的数组,只需要创建两个大小为(1,65),数据类型为np.float64的数组。
- iterCount 算法的迭代次数
- mode:可以设置为cv2.GC_INIT_WITH_RECT 或 cv2.GC_INIT_WITH_MASK,使用矩阵模式还是蒙板模式,也可以联合使用。
您还会在fgdModel之后注意到一个整数,它是算法将在图像上运行的迭代次数。您可以增加这些数量,但是在某个点上像素分类会收敛,并且有效地,您只是添加迭代而没有获得更多改进。
此后,我们的遮罩将更改为包含0到3之间的值。0和2 的值将被转换为0,而1-3 的值将被转换为1,并存储到mask2中,然后我们可以使用它来过滤掉所有的零值像素(理论上保持所有的前景像素不变):
mask2 = np.where((mask==2)|(mask==0),0,1).astype(‘uint8’)
img = img*mask2[:,:,np.newaxis]
代码的最后一部分将并排显示图像
plt.subplot(121), plt.imshow(img)
plt.title(“grabcut”), plt.xticks([]), plt.yticks([])
plt.subplot(122),
plt.imshow(cv2.cvtColor(cv2.imread(‘www.linuxmi.com.jpg’),
cv2.COLOR_BGR2RGB))
plt.title(“original”), plt.xticks([]), plt.yticks([])
plt.show()
运行文章代码,效果图如下: