こんにちは、Webプログラマの篠田です。
現在、AIを活用したサービスの開発を行っていますが、その中で「画像の比較」が必要となり、「背景差分法」について調べる機会があったので、まとめておきたいと思います。
背景差分法とは
動画の前処理として使われる手法の1つです。
具体的には、固定カメラで撮影した動画を使って、お店への来店者数や退室者数の測定などに活用できます。
原理としては、「背景のみ」の静止画像と「モノが写り込んだ背景」の静止画像を用意して、
「モノが写り込んだ背景」画像から「背景のみ」の画像を差し引いた画像が「変化」となります。
この手法は、動画だけでなく静止画でも活用できます。
サンプルとして、下記の2枚の画像を「背景差分法」を活用して、背景を取り除いた「差分」を抽出したいと思います。
【背景となる画像】
【差分を持つ画像】
Pythonによる背景差分法の活用
今回は、Pythonの「OpenCV」を活用してサンプル画像から「差分」を取ります。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 |
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() |
サンプルプログラムの実行
「影」などの不純な要素がありませんでしたので、綺麗に「変化(白い部分)」を取得することができました。
まとめ
目的としているプロジェクトでは、「影」や「日光環境」といったものを考慮しないので、「背景差分法」で十分条件を満たせそうです。
次回は「どれくらいの変化」かを測定する方法について考えてみたいと思います。