ようございます。こんにちは。こんばんは!情報理工学部SAコース2回生のフェリーです。

ここでは、Pythonで画像処理を行った時の話をします。ここで皆さんに紹介するコードは、画像認識でよく使われていると思いますので、画像処理に興味がある方は、いずれ書くことになると思いますので、ぜひ参考にしてください。

まず、よく使われている ライブラリ を知ろう!

画像処理でよく使われているモジュールは次の2つです。

  • Matplotlib
  • OpenCV (cv2)

Matplotlibは、データの可視化とグラフ生成のためのライブラリです。最初は、Pythonプログラミング言語NumPy数学拡張機能のために作成されました。

OpenCVは、画像や動画を処理するための機能がまとめて実装されているオープンソースのライブラリです。

どっちのライブラリは、わかりやすいコードで本確定な画像処理ができる利点がありますので、業界ではよく使われているそうです。

また、人の認識をするときには、カスケードファイルを使うことが多いです。これは、顔のすべての部分を明暗で識別したデータです。画像認識をするときは、基本的にグレイスケールの画像を使います。なぜなら、人間の視覚特性として色差成分よりも、輝度成分に対して強い感度を持っています。それに、計算量削減・作業メモリ削減もできます。なので、例えば、目や鼻の識別を行うときは、プログラムは画像の明暗の情報を見ます。

よく使われているカスケードファイルはopencvのGithubから取れます。

https://github.com/opencv/opencv/tree/master/data/haarcascades

この記事で扱うプログラムを見たかったら次のリンクから見てください。

https://github.com/FeleySM/Video-Image-Processing

人の顔を認識するプログラムを書こう!

人の顔を認識して、周りに赤い四角形を描くプログラムを作りました。ここで行っている処理は、いろんなプログラムで使われているので、ぜひ覚えていてください。使っている画像は次の画像です。

Face Red Square

基本的に、

  • 画像を読み込んで、グレイスケールに変換する
  • カスケードファイルを使って、グレイスケール画像の顔を認識する
  • 認識した部分に印をつけて、画像を出力する

を順にプログラムを書きます。プログラムの結果は次のようになります。

Face Red Square

いい感じですね。では、次にモザイク(ぼかし)をかける方法を見ましょう。同じグレイスケールの画像を使います。ここでは、detectMultiScale関数を使って、顔を検出します。モザイクをかけるプログラムは自分で作りましたが、ここでは説明を省略します(興味のある方は、後でコードを見てください)。

Face Mosaic

WEBCAMで同じことをしよう!

同じ技術を使って、ビデオで同じことができますが、少し難しいので、ここでは書きませんが、自分のパソコンのWEBCAMだったら、簡単にできます。OpenCVでWEBCAMの情報を取得する関数がありますので、意外と簡単にできます。

WEBCAMのビデオを出力するプログラムと、動いている部分に四角形を描くプログラムを書きました。 四角形を描くプログラムはちょっと難しいので、少し説明します。

このプログラムでも、グレイスケールの画像を使います。この画像を使って、Motion Blur Detection(モーションブラー検知)技術を使います。ぼかしを入れると、多くの情報が失われます。画像のぼやけを検出し、ぼやけた領域を再構築すると、この情報の一部を復元することができます。モーションブラーは通常、露光時間が移動速度に対して比較的長い場合に画像に作成されます。結構難しい概念なので、興味のある方は調べてください。

そして、検出したい物体とバックグラウンドを別々にしないといけません。これをするには、Thresholding(しきい値処理)技術を使います。しきい値処理は、コンピュータービジョンで最も一般的な(そして基本的な)セグメンテーション手法の1つであり、前景(つまり、関心のあるオブジェクト)を画像の背景から分離することができます。しきい値処理は、基本的に画像の2値化です。 一般に、グレースケール画像をバイナリ画像に変換します。ピクセルは0または255のいずれかです。操作は、ある画素の画素値がしきい値より大きければある値(白)を割り当て,そうでなければ別の値(黒)を割り当てます。

それから、動体を検出するには、「今の画像」と「1個前の画像」を比べる必要があります。ここでは、absdiff関数を使って、2つの画像の配列同士の要素毎の差の絶対値を求めます。そして、findContours関数を使って、オブジェクト輪郭検出を行います。2値化された画像は、情報を持つピクセルの値は 1 であり、情報を持たないピクセルの値は 0 であるので、1のピクセルは白色になりますので、その輪郭を取って、四角形を描きます。

これがビデオから動いているオブジェクトをとるための基本的なアルゴリズムの説明です。

終わりに

ここまで読んでくれてありがとうございます。この記事では、画像処理の基本を紹介しました。この知識を使って、ぜひもっと勉強して機械学習やディープラーニングの技術を用いて、例えば、動物を人工知能に覚えさせて、ビデオに出ている動物が出ている画像を出力するようなプログラムを書いてみたらいいと思います。これが、防犯カメラの人物検出で使われています。

Twitterでフォローしよう

おすすめの記事