如何使用OpenCV Python提取图像的前景?
我们使用 cv2.grabCut() 方法来提取图像中的前景。请按照以下步骤详细操作。
- 导入所需的库 OpenCV 和 NumPy 。确保您已经安装了它们。
-
使用 cv2.imread() 方法读取输入图像。指定完整的图像路径。
-
定义变量: mask,bgdModel 和 fgdModel。
-
定义矩形“ rect ”,包括前景对象的坐标,格式为 (x,y,w,h) 。正确的坐标对提取有意义的前景非常重要。
-
应用grabCut()算法来提取输入图像的前景。将 mask,rect,bgdModel,fgdModel,iterCount 和 mode 作为参数传递给算法。我们将模式应用为 cv2.GC_INIT_WITH_RECT ,因为我们使用矩形。
cv2.grabCut(img,mask,rect,bgdModel,fgdModel,iterCount,cv2.GC_INIT_WITH_RECT)
-
获取新掩模mask2。将新掩模与图像相乘以找到分段图像(前景)。
-
显示提取的前景。
让我们来看一个程序示例,以更好地理解。
示例
在此示例中,我们提取输入图像中的前景。
# 导入所需的库
import numpy as np
import cv2
# from matplotlib import pyplot as plt
# 读取输入图像
img = cv2.imread('people.jpg')
# 定义蒙版
mask = np.zeros(img.shape[:2],np.uint8)
bgdModel = np.zeros((1,65),np.float64)
fgdModel = np.zeros((1,65),np.float64)
# 定义矩形
rect = (150,50,500,470)
# 应用grabCut方法提取前景
cv2.grabCut(img,mask,rect,bgdModel,fgdModel,20,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()
cv2.imshow('前景图像',img)
cv2.waitKey(0)
cv2.destroyAllWindows()
输出
当我们执行上面的程序时,将会产生以下输出窗口。
我们在上面的程序代码中使用 iterCount 值为20。您可以调整算法应运行的迭代次数以获得更好的结果。此外,所定义矩形的坐标(在示例程序中提到的 rect )也非常重要。我们使用 rect = (150,50,500,470) 因为我们的前景位于这些坐标之内。根据输入图像更改这些坐标。