Link API Reference
マスクを設定することも可能(割愛)。cv2.GC_INIT_WITH_MASKを設定。
マスクの設定値 cv2.GC_BGD:明らかに背景, cv2.GC_FGD:明らかに前景, cv2.GC_PR_BGD:背景かもしれない, cv2.GC_PR_FGD:前景かもしれない
# -*- coding: utf-8 -*-
import cv2
import numpy as np
#Ipythonで表示用の設定
import matplotlib.pyplot as plt
%matplotlib inline
#画像読込
in_img = cv2.imread("lena.jpg")
#表示用にコピー
clone_img = in_img.copy()
mask = np.zeros(in_img.shape[:2],np.uint8)
bgdModel = np.zeros((1,65),np.float64)
fgdModel = np.zeros((1,65),np.float64)
#ROIの設定(左上座標(x,y),width,height)
rect = (200,200,200,200)
#GrabCut実行
mask, bgdModel, fgdModel = cv2.grabCut(in_img, mask, rect, bgdModel, fgdModel, 5, cv2.GC_INIT_WITH_RECT)
#マスク結果を参考に非抽出塗潰し
mask2 = np.where((mask==2)|(mask==0), 0, 1).astype('uint8') # 0:背景、2:背景かもしれない を0に。それ以外1。
in_img = in_img * mask2[:,:,np.newaxis]
#ROIの表示(赤枠)。確認用。
cv2.rectangle(clone_img, (200,200), (200 + 200,200 + 200), (0,0,255), 2)
#OpenCVがBGRなのでRGBに変換
disp_clone_img = cv2.cvtColor(clone_img, cv2.COLOR_BGR2RGB)
disp_in_img = cv2.cvtColor(in_img, cv2.COLOR_BGR2RGB)
print cv2.GC_BGD, cv2.GC_FGD, cv2.GC_PR_BGD, cv2.GC_PR_FGD
#画像表示
plt.figure(figsize=(12,12))
plt.subplot(121)
plt.imshow(disp_clone_img)
plt.title('Input Image')
plt.subplot(122)
plt.imshow(disp_in_img)
plt.title('Extracted Region')
plt.show()