如何使用OpenCV Python提取图像的前景?


我们使用cv2.grabCut()方法提取图像中的前景。有关详细方法,请按照以下步骤操作:

  • 导入所需的库OpenCVNumPy。确保你已经安装了它们。

  • 使用cv2.imread()方法读取输入图像。指定完整的图像路径。

  • 定义变量:mask、bgdModelfgdModel

  • 定义包含前景对象的矩形的坐标“rect”,格式为(x,y,w,h)。正确的坐标对于提取有意义的前景非常重要。

  • 应用grabCut()算法提取输入图像的前景。将mask、rect、bgdModel、fgdModel、iterCountmode作为参数传递给算法。我们使用cv2.GC_INIT_WITH_RECT作为模式,因为我们使用的是矩形。

cv2.grabCut(img,mask,rect,bgdModel,fgdModel,iterCount,cv2.GC_IN IT_WITH_RECT)
  • 获取新的掩码mask2。将新的掩码与图像相乘以找到分割后的图像(前景)。

  • 显示提取的前景。

让我们来看一个程序示例,以便更好地理解。

输入图像

我们将在下面的示例中使用以下图像作为输入文件。


示例

在这个例子中,我们提取输入图像中的前景。

# import required libraries import numpy as np import cv2 # from matplotlib import pyplot as plt # read input image img = cv2.imread('people.jpg') # define mask mask = np.zeros(img.shape[:2],np.uint8) bgdModel = np.zeros((1,65),np.float64) fgdModel = np.zeros((1,65),np.float64) # define rectangle rect = (150,50,500,470) # apply grabCut method to extract the foreground 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] # display the extracted foreground image # plt.imshow(img),plt.colorbar(),plt.show() cv2.imshow('Foreground Image',img) cv2.waitKey(0) cv2.destroyAllWindows()

输出

当我们执行上述程序时,它将产生以下输出窗口。


我们在上面的程序代码中使用iterCount为20。你可以调整算法应运行的迭代次数以获得更好的结果。同样,为了获得更好的结果,矩形坐标(示例程序中提到的rect)非常重要。我们使用rect = (150,50,500,470),因为我们的前景位于这些坐标内。根据输入图像更改这些坐标。

更新于:2022年12月2日

3K+ 次浏览

启动你的职业生涯

通过完成课程获得认证

开始学习
广告