在这篇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()

运行文章代码,效果图如下:

 

发表评论

电子邮件地址不会被公开。 必填项已用*标注