上の画像を見てみると、背景はおよそ明るさ(輝度値)が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を使った小技的なものを紹介していきます!