Grab Cutによる領域抽出

V3.0.0

マスクを設定することも可能(割愛)。cv2.GC_INIT_WITH_MASKを設定。

マスクの設定値 cv2.GC_BGD:明らかに背景, cv2.GC_FGD:明らかに前景, cv2.GC_PR_BGD:背景かもしれない, cv2.GC_PR_FGD:前景かもしれない

In [31]:
# -*- 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()
0 1 2 3

inserted by FC2 system