はじめに

昨今、 AIや機械学習といったワードとともにPythonで開発できるエンジニアの需要が高まっています。

その中でも重要なのが、自動運転や顔認証など様々な分野で幅広く利用されている、画像処理です。

単に画像を加工して表示するだけでなく、機械学習で使用するための前処理に必要となります。

今後Pythonで開発していくエンジニアにとって必須のスキルといえるでしょう。

最近では野菜を自動で検出し、収穫に適した野菜だけを自動で収穫するロボットなども登場しているようです。

農業の効率化に向けたへ一つの有効なアプローチとなっているでしょう。このロボットにも、画像処理の技術が用いられています。

この記事では、この画像処理をPythonで簡単に実装できる「OpenCV」というライブラリを紹介します。


OpenCVとは

OpenCVとは、画像処理をする際に必要になる様々な機能が用意されているライブラリのこと。

コンピュータビジョン向けのオープンソースのライブラリです。

OpenCVのライセンスは 「3-clause BSD License」 であり、条件付きで使用することができます。

詳しくは、OpneCVのgithubリポジトリをご覧ください。

この記事ではPythonでの使い方を紹介しますが、C++やJavaといった他の言語向けのAPIも用意されています。

具体的にできることやオススメする理由、使い方などについては後ほど紹介します。


画像処理とは

よく画像処理と聞くことがありますが、そもそも何をすることを指すのでしょうか。

一般に広く使われているのは、大きさを変更したり色を変えたり、反転させたりすることのように思います。

これらの処理は、スマートフォンなどで手軽に使える画像加工アプリなどで親しみがあるのではないでしょうか。

画像処理にはこういった身近なものから、画像の中から特定の情報だけを抽出

文字や顔などを検出したりとより応用的なものまで含まれます。

これは一見簡単な事のように見えるかもしれません。

しかし、コンピュータの内部では想像以上に複雑なことをしています。

人間の目には人は人、食べ物は食べ物であると認識できます。

コンピュータには、極端にいえば数字の羅列としてしか認識されていません

この中から一定の規則を導き出すために、大量の画像データを読み取り学習させます。

そうすることで色の境目や人間の顔を認識することができるのです。

以下に、身近に行なっている画像処理を具体的に示します。


リサイズ

画像の大きさを任意のものに変更します。

内部的には、画素数を削ることにより、画像を表示するのに必要な辺の長さを縮めています。

その結果、縮小させた画像は元画像に比べて粗くなることが多いです。


グレースケール

画像を黒と白の二色間で、明るさを変えて表現します。

内部的には、RGBの数値から、それに当てはまる白と黒の間の数値を推定して変換しています。


Pythonで使える画像処理ライブラリ

Pythonには、OpenCV以外にも画像処理を行うことのできるライブラリがあります。

以下にいくつかの具体例とともに簡単に紹介します。

興味があれば、こちらも調べてみてください。

パス指定などは適宜変更するようにしましょう。


Pillow

PILという現在は開発が停止しているライブラリからフォークしたPython用の画像処理ライブラリです。

リサイズや画像の一部切り出しなど、単純な処理のみを行うことができます。

  1. “`python

  2. # リサイズ処理

  3. from PIL import Image

  4. img = Image.open(‘./assets/lena.jpg’)

  5. img_resize = img.resize((50, 50))

  6. img_resize.save(‘./assets/lena_resize.jpg’)

  7. “`


scikit-image

画像処理のためのアルゴリズムがまとまっているPython用のライブラリです。

Pillowと比べてより複雑な処理が可能です。

  1. “`python

  2. # グレースケール処理

  3. from skimage import io

  4. from skimage.color import rgb2gray

  5. img = io.imread(‘./assets/lena.jpg’)

  6. gray_img = rgb2gray(img)

  7. io.imsave(‘./assets/lena_gray.jpg’, gray_img)

  8. “`


OpenCVの特徴とは

ここまで、画像処理についてとPythonでの実装方法について簡単に紹介してきました。

一見すると、画像処理をする際に必要な機能は他のライブラリにも揃っているように思えます。

しかし、OpenCVには他のライブラリとは異なる特徴があるのです。

それは、OpenCVが「コンピュータビジョン」向けのライブラリだということ。

以下では、簡単にコンピュータビジョンについて紹介します。


コンピュータビジョンとは

コンピュータビジョンとは、画像処理に関する研究分野の一つ

人間が見ているものをどうやってコンピュータに同じように認識させるかを研究することです。

身近に感じてもらうために、野球を例にあげます。

ピッチャーがボールを投げてから、バッターがボールに当てるためにバットを振るまでを考えます。

バッターは無意識のうちに蹴り出しの足の動き、手の指先までの連動した動きを確認しボールの動きを予測。

この後も一瞬のうちに様々なことを目で捉え、我々の想像しているよりはるかに多い情報を処理しています。

これをコンピュータでいかに再現するかというのがコンピュータビジョンの研究です。

身近にある例をいくつか挙げます。

代表的なものは、スマートフォンについているカメラなどの、いわゆるデジタルカメラです。

最近だと、自動で顔を認識してピントの調節をする機能がついているものがほとんどになります。

この顔検出技術はコンピュータビジョンの研究の一つ。

他にはプロジェクションマッピングという建物などの形に合わせて、画像などを投影する技術です。

東京駅の外壁に投影されているものは有名ではないでしょうか。

この時に画像を投影する物体の形を検出するのにも、コンピュータビジョンの技術が使われています。

難しそうに感じるかもしれませんが、コンピュータビジョンは、すでに我々の生活の中に入り込んでいるとても身近な研究分野です。


OpenCVでできること

OpenCVには、こういったことを効率的に行うための機能が実装されています。下記は、代表的な画像処理の列挙です。

  • 文字や図形の画像への描画
  • 画像の平滑化
  • モルフォロジー変換
  • 当たり判定変換
  • 閾値変換

こういった画像処理は、静止画にとどまらず動画においても可能です。

この記事では実際の使い方などは解説しませんが、動画に対して可能な処理も一部紹介しておきます。

OpenCVでは、動画をある時間分で区切ったり、動画内にモザイクを表示させたりすることが可能です。

また、動いている自動車のナンバープレートを読み取ったりもできます。

他にも「オプティカルフロー」というものも。

物体や動画を撮影しているカメラが動くことで生じる映像内に写っている特定の物体における特徴点の動きを抽出する機能も。

これを学習させる事で、一枚の静止画から画像内に写っている特定の物体がその後どのように動くかを推定することができます。

このようにOpenCVでできることはとても多く、実際の開発にも広く使用されています。

それでは、実際にOpenCVをインストールしていくつかの機能を触っていきます。


OpenCVの始め方

始めるにあたって

こちらでは、OpenCVをインストールするところから、実際にいくつかの機能で画像処理をしてみましょう。

一例として、以下の環境とバージョンで行うことにします。

  • macOS Mojave (10.14.6)
  • Homebrew (2.2.6)
  • Python (3.8.1)
  • pip (20.0.2)


インストール

Pythonで簡単にOpenCVを使うために、opencv-pythonというパッケージが用意されています。

pipでインストールしましょう。

  1. “`bash

  2. $ pip install opencv-python

  3. “`

他に、サンプル画像や事前に学習させたモデルが揃っているパッケージが用意されています。

こちらはbrewでインストールしたものです。

  1. “`bash

  2. $ brew install opencv

  3. “`

これでOpenCVを使う準備が整いました。

次に、ソースコードを交えて、実際の使用方法について紹介します。


基本的な画像処理

こちらでは上で紹介したような基本的な画像処理を扱います。単に画像を加工したり、機械学習の前処理として使うことが多いです。


読込・表示・保存

画像処理をする際に必須の機能です。どのライブラリでも基本的には用意されています。

OpenCVでは、ndarrayの形式で読み込まれます。

  1. “`python

  2. import cv2




  3. 読込




  4. img = cv2.imread(‘./assets/lena.jpg’)

  5. print(type(img))

  6. ## ——–> <class ‘numpy.ndarray’>




  7. 表示




  8. cv2.imshow(“lena”, img)


保存


  1. cv2.imwrite(“lena_processed.jpg”,img)
  2. “`


トリミング

範囲を設定し、画像を部分的に切り出します。この例では長方形ですが、丸や他の形にも切り取ることが可能です。

また画像を任意の大きさに変更します。小さい画像を大きくするときには、画像が粗くなってしまう場合があるので注意が必要です。

  1. “`python

  2. import cv2




  3. img = cv2.imread(“./assets/lena.jpg”)

トリミングはこちらを参考にしてください。

  1. img_trim = img[150 : 300, 100 : 400]


色変換

画像の色を任意に変えることができます。「ネガポジを反転」させたり、「減色」といって使用する色の種類を減らすこともできます。

機械学習の前処理としてよく用いられるのは、「グレースケール」と呼ばれる、黒と白の二色間で明るさを変えて表現する手法です。

これは画像処理をする際に、余計な情報を入れずに効率的に計算を行うためです


回転・反転

文字通り画像を回転させたり反転させたりする機能です。

機械学習のうち、教師あり学習では大量の教師データが必要とされます。

同じような画像を何枚も手で用意するのは非常に苦労するため、同じ画像を反転させることにより、データの水増しを行います。

これらの画像は、教師データとしては別の画像として扱われるため、非常に有用です。


応用的な画像処理

ここからは少し複雑な画像処理を行います。加工した画像を元にさらに加工したり、画像の一部を検出したりします。

OpenCVの特徴となっているコンピュータビジョンの範囲です。


ぼかし処理

ガウシアンフィルタなどを利用できます。

モザイク処理とは違い、画素の輝度値を平均化することにより画像をぼかします。

一般的には、ノイズなどを理に用いられることが多いです。


モザイク処理

モザイク処理は、本来リサイズ処理の応用です。

一度画像を小さくして、その解像度で画像を元の大きさに戻しているのです。

そうすると画像全体が粗くなるので、いわゆるモザイクがかかったように見えるようになります。

使われる頻度は高くありませんが、画像の一部にモザイクをかけて教師データの水増しに使うこともあるようです。


エッジ検出

「特徴検出」といわれるものの一種で、簡単にいうと「明るさの変化が際立っている部分」を検出する処理です。

エッジ検出を行うことで、画像に写っている物体の境目などがはっきりします。

結果として何が写っているのかを検出するのに役立ちます。


物体検出

物体認識のうち、指定した物体のクラスを検出することです。

クラスとは犬や猫、自転車といった一般的なカテゴリのことをいいます。

物体認識は特定物体認識一般物体認識に分類され、物体検出は一般物体認識に分類されます。

また、物体検出には様々な手法があります。

より深く知りたい方は、こちらに関しても調べてみてください。

今回は、事前に用意されている学習モデルのうち、顔の正面のモデルを用いて検出を行います。

まず顔に当たる部分を検出した後、該当する部分の座標に対して、紹介した方法でモザイクをかけています。

処理結果のように、きちんと顔の範囲が四角く検出されています。


OpenCVをオススメする理由

ここまでOpenCVを使って何ができるかを紹介してきました。

ソースコードを見てわかる通り、それぞれの処理はたった数行のコードで実現できてしまいます。

もちろん、実際にサービスとして運用する際にはより様々なことを考える必要があります。

要件に合った実装をしなくてはなりません。

ですがOpenCVは、単体でとても強力なライブラリだといえます。

こういったライブラリがなかった頃は、紹介してきたような画像処理を自分で一から記述する必要がありました。

OpenCVが登場したことで、専門的な知識がなくても、高度な画像処理が可能になったのです。

またこの記事では詳しく紹介していませんが、動画の処理においてもできることがたくさんあります。

これからの時代、動画を扱う場面がより多くなってくる可能性は非常に高いです。

一つのライブラリでこれだけ多くのことができるので、画像処理をする際は十分に機能出来るでしょう。

Pythonにおいては、OpenCVはコンピュータビジョン向けのライブラリとしてデファクトスタンダードになっています。

今のうちに扱えるようになっておくと良いでしょう。


まとめ

この記事ではOpenCVとは何か、どのように使うことができて、何に役立つのかを紹介してきました。

最近では伝達の手段がテキストから動画に移り変わりつつあります。

そして、IoTの需要増加で様々なものを認識できなくてはならなくなってきたりしています。

画像処理の基本的な部分から、複雑なことまで幅広く扱えるOpenCV。

今のうちにぜひ使えるようになるのも手ではないでしょうか。