Pythonで画像処理 マスク処理

Pythonで画像を操作する方法を簡単に解説しています。

目次

NumPyとは?

今回はPythonのNumPyを使った画像処理を紹介していきたいと思います。
NumPyは、プログラミング言語Pythonにおいて数値計算を効率的に行うための拡張モジュールである。効率的な数値計算を行うための型付きの多次元配列(例えばベクトルや行列などを表現できる)のサポートをPythonに加えるとともに、それらを操作するための大規模な高水準の数学関数ライブラリを提供する。
すなわち、行列を扱うのに便利なライブラリです。画像も縦横の升目に値が格納される行列として表現されるため、NumPyを使うといろいろ便利なことがあります。

どんなことができるのか??

NumPyには実に様々な機能が実装されています。その中の一例を紹介していくことにします。なお、以下のコードを実行するためには、OpenCVとNumPy、matplotlibがインストールされている必要があります。

このネズミの画像を使っていくことにします。

まずは画像を表示するだけのコードです

OpenCVのimread関数で画像を読み込んだ場合、NumPyが使われて情報が保持されます。
今回はグレースケールで画像を読み込みます。imread関数の第二引数に0を指定することでグレースケールで読み込まれます。
import cv2
import numpy as np
import matplotlib.pyplot as plt

img = cv2.imread('001.jpg' ,0)
plt.imshow(img)
plt.colorbar()
plt.show()
plot.py

matplotlibでグレースケール画像を描画させると、自動的に疑似カラーで描画してくれます。この場合、明るいところが赤く、暗いところが青く表示されていることがわかりますね。カラーバーはplt.colorbar()の部分で描画することを指定しています。

OpenCV関数を使わずに、NumPyで背景マスクをしてみる

上の画像を見てみると、背景はおよそ明るさ(輝度値)が210以上であることがわかります。今回は輝度値が210以上の領域を0に、210未満の領域を1にしてみます。
import cv2
import numpy as np
import matplotlib.pyplot as plt

img = cv2.imread('001.jpg' ,0)
img[img < 210] = 1
img[img >= 210] = 0

plt.imshow(img)
plt.colorbar()
plt.show()
bin.py

シルエットが表示されたと思います。カラーバーを見てみると、自動的に0~1に幅がスケールされていますね。
img[img < 210] = 0 の意味するものは、「imgの210未満の画素値を持つ場所については、imgのその場所の画素値を0にする」というようなものです。

画像どうしの掛け算

次に画像どうしの掛け算をしてみたいと思います。NumPyで*演算子を使った場合、要素ごとの積になります。いわゆる行列の積ではないので注意です!せっかくですので、ここまでで作ったマスク画像(ネズミがいる領域が1で他が0になっている画像)を活用します。

このマスク画像と元の画像を掛け算するとどうなるでしょうか。。。
import cv2
import numpy as np
import matplotlib.pyplot as plt

img1 = cv2.imread('001.jpg' ,0)
img2 = cv2.imread('001.jpg' ,0)

img2[img2 < 210] = 1
img2[img2 >= 210] = 0

img3 = img1*img2

plt.imshow(img3)
plt.colorbar()
plt.show()
mask.py

こんな感じに背景部分が0になった画像ができたと思います。すなわち、マスク画像で1になっている部分は1を掛けるのでそのままに、0になっている部分は0を掛けるので0になるということです。

実はもっと簡単に書くこともできます

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

img = cv2.imread('001.jpg' ,0)
img[img >= 210] = 0

plt.imshow(img)
plt.colorbar()
plt.show()
mask2.py
2個前のコードから、img[img >= 210] = 0を抜くだけですね。全く同じ出力が得られます。

続きます!

次回もこんな感じでNumPyを使った小技的なものを紹介していきます!