OpenCV
Python3

OpenCVのaccumulateWeightedのmaskの動作がイマイチよく分からないので実験してみた


目的

画像の加重平均を作る関数であるaccumulateWeightedには、オプション変数としてmaskが指定できます。

が、maskを指定するとどういう処理になるのか、公式ドキュメントやらwebの情報やらでもいまいちよく分からないので、実験してみました。


環境


  • python 3.6.1

  • opencv 3.4.1+contrib

  • numpy 1.14.3

  • jupyter notebook上で処理


やったこと


  1. 2pixelの「グレイスケール画像」(初期値は真っ黒[0,0])を作成

  2. 2pixelの「マスク画像」[255, 0]を作成

  3. このマスク画像を使って、1.のグレイスケール画像に対し、accumulateWeightedを用いて、真っ白の画像[255,255]との加重平均を複数回求める

  4. このときの、各ピクセルの輝度の変化を求める


ソースコードと解説

まず、各種モジュールのインポートをします。

import cv2

import numpy as np
from matplotlib import pyplot as plt

%matplotlib inline

処理をする画像の初期値やマスク画像を作成。

# 2pixelの真っ黒グレイスケール画像

accumImg = np.zeros(2, dtype = np.float32)

# 処理結果の格納先
img = np.empty((0,2))

# maskデータ
mask = np.array([255,0],dtype = np.uint8)

20回、真っ白画像を加重平均して、各回について値を保管。

for i in range (20):

newImg = np.array([255,255], dtype=np.float32)
cv2.accumulateWeighted(newImg, accumImg, 0.1, mask = mask)
img = np.append(img, [accumImg], axis = 0)

そして、結果を表示します。

plt.plot(img[:,0], label="mask:255", color="red")

plt.plot(img[:,1], label="mask:0", color = "blue")
plt.legend()


実行結果

image.png

maskデータを255とした側のピクセルの値のみ、変動した、ということになります。


結論

accumulateWeightedの実行時、maskデータで指定された値に応じて、以下のように動作する

* 「0」が指定されたピクセル:加重平均されず、旧の値が保存される

* 「1」が指定されたピクセル:加重平均され、値が更新される