天天看點

Opencv互動式前景提取之Grabcut算法1 理論2 測試圖像3 實作

文章目錄

  • 1 理論
  • 2 測試圖像
  • 3 實作

1 理論

  從使用者角度,Grabcut算法是如何工作的?

  1)使用者在前景區域繪制一個舉行,應盡可能包括前景區域;

  2)算法疊代分割處理,以擷取最佳結果;

  3)目前景區域标記為背景,或者反之時,需要使用者進行精修;

  4)繼續疊代更新。

  從算法角度呢?

  1)矩形外部标記為背景,内部則标記為未知的;

  2)使用高斯混合模型對背景和未知進行模組化。未知像素根據顔色統計上與其他标記像素的關系,來标記可能的前景或背景;

  3)根據以上标記建立圖像,圖中的節點為像素,并添加兩個節點:源節點和接收器節點。

  4)前景像素都連接配接到源節點,背景像素則連接配接到接收器節點,并通過是前景的機率來定義連接配接權重。

  5)像素之間的權重由邊緣資訊或像素相似度定義。如果像素顔色差異很大,則它們之間的邊緣将降低;

  6)使用mincut算法分割圖像:将圖像切割為具有最小成本函數的兩個分離的源節點和接收器節點。成本函數是指被切割邊緣的所有權重的總和;

  7)源節點的像素變為前景,餘下變為背景 ;

  8)疊代,直至收斂。

2 測試圖像

Opencv互動式前景提取之Grabcut算法1 理論2 測試圖像3 實作

3 實作

# coding: utf-8
import cv2 as cv
import numpy as np


def grab_cut(file_name):
    """"""
    img = cv.imread(file_name)
    # 将确定為前景的地方标記為1
    mask = np.zeros(img.shape[:2], np.uint8)
    mask[200: 1000] = 1
    bg_model = np.zeros((1, 65), np.float64)
    fg_model = np.zeros((1, 65), np.float64)
    mask, bg_model, fg_model = cv.grabCut(img, mask, None, bg_model, fg_model, 5, cv.GC_INIT_WITH_MASK)
    mask = np.where((mask == 2) | (mask == 0), 0, 1).astype('uint8')
    img = img * mask[:, :, np.newaxis]
    cv.imshow("", img)
    cv.waitKey()


if __name__ == '__main__':
    file_name = "miao.png"
    grab_cut(file_name)
           

  輸出如下:

Opencv互動式前景提取之Grabcut算法1 理論2 測試圖像3 實作

  啊這。。