文章目錄
- 1 理論
- 2 測試圖像
- 3 實作
1 理論
從使用者角度,Grabcut算法是如何工作的?
1)使用者在前景區域繪制一個舉行,應盡可能包括前景區域;
2)算法疊代分割處理,以擷取最佳結果;
3)目前景區域标記為背景,或者反之時,需要使用者進行精修;
4)繼續疊代更新。
從算法角度呢?
1)矩形外部标記為背景,内部則标記為未知的;
2)使用高斯混合模型對背景和未知進行模組化。未知像素根據顔色統計上與其他标記像素的關系,來标記可能的前景或背景;
3)根據以上标記建立圖像,圖中的節點為像素,并添加兩個節點:源節點和接收器節點。
4)前景像素都連接配接到源節點,背景像素則連接配接到接收器節點,并通過是前景的機率來定義連接配接權重。
5)像素之間的權重由邊緣資訊或像素相似度定義。如果像素顔色差異很大,則它們之間的邊緣将降低;
6)使用mincut算法分割圖像:将圖像切割為具有最小成本函數的兩個分離的源節點和接收器節點。成本函數是指被切割邊緣的所有權重的總和;
7)源節點的像素變為前景,餘下變為背景 ;
8)疊代,直至收斂。
2 測試圖像
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)
輸出如下:
啊這。。