こんにちは、Webプログラマの篠田です。
現在、AIを活用したサービスの開発を行っていますが、その中で「画像の比較」が必要となり、「背景差分法」について調べる機会があったので、まとめておきたいと思います。
背景差分法とは
動画の前処理として使われる手法の1つです。
具体的には、固定カメラで撮影した動画を使って、お店への来店者数や退室者数の測定などに活用できます。
原理としては、「背景のみ」の静止画像と「モノが写り込んだ背景」の静止画像を用意して、
「モノが写り込んだ背景」画像から「背景のみ」の画像を差し引いた画像が「変化」となります。
この手法は、動画だけでなく静止画でも活用できます。
サンプルとして、下記の2枚の画像を「背景差分法」を活用して、背景を取り除いた「差分」を抽出したいと思います。
【背景となる画像】

【差分を持つ画像】

Pythonによる背景差分法の活用
今回は、Pythonの「OpenCV」を活用してサンプル画像から「差分」を取ります。
import cv2
#「背景」となる画像の取り込み(グレースケール)
img_src01 = cv2.imread("sample01.png", 0)
#「差分」をもった画像の取り込み(グレースケール)
img_src02 = cv2.imread("sample02.png", 0)
#「背景差分」計算用オブジェクトの作成
bgObj = cv2.bgsegm.createBackgroundSubtractorMOG()
#差分となっている「前景領域」に対してマスクをかける
fgmask = bgObj.apply(img_src01)
fgmask = bgObj.apply(img_src02)
#画面に表示
cv2.imshow('frame', fgmask)
#「差分」画像のファイル名
bg_diff_path = "./diff.jpg"
#「差分」画像の保存
cv2.imwrite(bg_diff_path, fgmask)
#「キー」が押されるまで画面を表示
cv2.waitKey(0)
#作成した画面をすべて破棄
cv2.destroyAllWindows()
サンプルプログラムの実行

「影」などの不純な要素がありませんでしたので、綺麗に「変化(白い部分)」を取得することができました。
まとめ
目的としているプロジェクトでは、「影」や「日光環境」といったものを考慮しないので、「背景差分法」で十分条件を満たせそうです。
次回は「どれくらいの変化」かを測定する方法について考えてみたいと思います。









