OPENCV:使用Grabcut算法進行物體分割

目錄

1 GrabCut算法

2 算法圖

3 代碼 

4 結果

 

1 GrabCut算法

GrabCut算法的實現步驟:

  1. 在圖片中定義(一個或者多個)包含物體的矩形(注意:初始框)。

  2. 矩形外的區域被自動認爲是背景

  3. 對於用戶定義的矩形區域,可用背景中的數據來區分它裏面的前景和背景區域。

  4. 用高斯混合模型(GMM)來對背景和前景建模,並將未定義的像素標記爲可能的前景或者背景。

  5. 圖像中的每一個像素都被看做通過虛擬邊與周圍像素相連接,而每條邊都有一個屬於前景或者背景的概率,這是基於它與周邊像素顏色上的相似性。

  6. 每一個像素(即算法中的節點)會與一個前景或背景節點連接。

  7. 在節點完成連接後(可能與背景或前景連接),若節點之間的邊屬於不同終端(即一個節點屬於前景,另一個節點屬於背景),則會切斷他們之間的邊,這就能將圖像各部分分割出來。

2 算法圖

3 代碼 

import numpy as np
import cv2
from matplotlib import pyplot as plt


def grabut(imgpath, rect, iterCount):
    img = cv2.imread(imgpath)
    # 創建一個與所加載圖像同形狀的Mask
    mask = np.zeros(img.shape[:2], np.uint8)

    # 算法內部使用的數組,必須創建兩個np.float64 類型的0數組,大小是(1, 65)
    bgdModel = np.zeros((1, 65), np.float64)
    fgdModel = np.zeros((1, 65), np.float64)

    cv2.grabCut(img, mask, rect, bgdModel, fgdModel, iterCount, cv2.GC_INIT_WITH_RECT)

    # 掩模已經變爲包含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(cv2.cvtColor(cv2.imread(imgpath),  cv2.COLOR_BGR2RGB))
    plt.title("original"), plt.xticks([]), plt.yticks([])
    plt.subplot(122), plt.imshow(cv2.cvtColor(img, cv2.COLOR_BGR2RGB))
    plt.title("grabcut"), plt.xticks([]), plt.yticks([])
    plt.show()


if __name__ == '__main__':
    imgpath = 'img/dog.jpg'
    # 人工前景的矩形區域(rect.x,rect.y,rect.width,rect.height)
    rect = (200, 60, 700, 640)
    grabut(imgpath, rect, 5)
    pass

4 結果

 

參考資料:Opencv3 計算機視覺 python語言實現 

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章