Python AI 画像

OpenCV、matplotlib、NumPyで前景抽出を行う。

OpenCV、matplotlib、numpyでほとんどの画像処理ができます。
OpenCVは、インテルが開発・公開したオープンソースライブラリで現在はITseezが保守しています。
matplotlibは、Python及びその科学計算用ライブラリNumPyのためのグラフ描画ライブラリです。
conda install -c conda-forge opencvconda install numpy、でインストールできます。
matplotlibは、anacondaでpythonをインストールすると自動的にインストールされるようです。

In [12]:
# grabcut interactive foreground extraction using iterated graph cuts

import numpy as np
import cv2
from matplotlib import pyplot as plt

前景抽出に用いる画像を読み込みます。今回はメッシ選手の画像を用います。事前にインターネット上からダウンロードしてください。インターネット上にはかなりあるのですが、著作権問題は大丈夫なのでしょうか

In [13]:
img = cv2.imread('messi5.jpg')
In [14]:
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]
In [15]:
fig = plt.figure(), plt.imshow(bgdModel), plt.show()
In [16]:
fig = plt.figure(), plt.imshow(fgdModel), plt.show()
In [17]:
fig = plt.figure(), plt.imshow(mask), plt.show()
In [18]:
fig = plt.figure(), plt.imshow(mask2), plt.show()
In [19]:
fig = plt.figure(), plt.imshow(img), plt.colorbar(), plt.show()

未検出の前景領域を白色で、誤検出した背景領域を黒色、それ以外を灰色に設定したマスク画像を新たに用意します。

In [20]:
# 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()
In [ ]: