如何使用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+ 次瀏覽

啟動你的職業生涯

透過完成課程獲得認證

開始學習
廣告