OpenCV、matplotlib、numpyでほとんどの画像処理ができます。
OpenCVは、インテルが開発・公開したオープンソースライブラリで現在はITseezが保守しています。
matplotlibは、Python及びその科学計算用ライブラリNumPyのためのグラフ描画ライブラリです。
conda install -c conda-forge opencv
、conda install numpy
、でインストールできます。
matplotlibは、anacondaでpythonをインストールすると自動的にインストールされるようです。
# grabcut interactive foreground extraction using iterated graph cuts
import numpy as np
import cv2
from matplotlib import pyplot as plt
前景抽出に用いる画像を読み込みます。今回はメッシ選手の画像を用います。事前にインターネット上からダウンロードしてください。インターネット上にはかなりあるのですが、著作権問題は大丈夫なのでしょうか
img = cv2.imread('messi5.jpg')
mask = np.zeros(img.shape[:2], np.uint8) # height, width, type unit8で0埋め
bgdModel = np.zeros((1, 65), np.float64)
fgdModel = np.zeros((1, 65), np.float64)
rect = (50, 50, 450, 270) # input top left, bottom right in foreground
cv2.grabCut(img, # input image
mask, # mask image 0: background, 1: foreground, 2: may be background, 3: may be foreground
rect, # rectangle of foreground
bgdModel, # array used in internal algorism
fgdModel, # array used in internal algorism
5, # iterational count in algorism
cv2.GC_INIT_WITH_RECT) # initialize mode
mask2 = np.where((mask==2)|(mask==0), 0, 1).astype('uint8')
img = img*mask2[:, :, np.newaxis]
fig = plt.figure(), plt.imshow(bgdModel), plt.show()
fig = plt.figure(), plt.imshow(fgdModel), plt.show()
fig = plt.figure(), plt.imshow(mask), plt.show()
fig = plt.figure(), plt.imshow(mask2), plt.show()
fig = plt.figure(), plt.imshow(img), plt.colorbar(), plt.show()
未検出の前景領域を白色で、誤検出した背景領域を黒色、それ以外を灰色に設定したマスク画像を新たに用意します。
# newmask is the mask image I manually labelled
newmask = cv2.imread('messi_grabcut_newmask.png', 0) # should be prepared
# whereever it is marked white (sure foreground), change mask=1
# whereever it is marked black (sure background), change mask=0
mask[newmask == 0] = 0 # black to 0 (background)
mask[newmask == 255] = 1 # white to 1 (foreground)
mask, bgdModel, fgdModel = cv2.grabCut(img, mask, None, bgdModel, fgdModel, 5, cv2.GC_INIT_WITH_MASK)
mask = np.where((mask==2)|(mask==0), 0, 1).astype('uint8')
img = img*mask[:, :, np.newaxis]
fig = plt.figure(), plt.imshow(img), plt.colorbar(), plt.show()