OpenCVを使ってみよう(2.画像をグレースケール変換する)


OpenCVを使ってみよう(1.ライブラリのインポート)ではOpenCVを使用するための準備を紹介しました。

今回はいよいよOpenCVを使用して画像処理を行う方法を紹介します。

画像処理といっても色々とありますが、今回は画像処理を行うための下準備に必要なグレースケール変換を行う方法を紹介します。

詳細は以下から。

なぜグレースケールが必要か

画像処理や画像認識は色情報に精度や効果を左右されるため、できるだけ色を単純化したほうが処理が行い易くなります。

そのため、画像処理や画像認識を行う場合は、主処理を行う前にまず対象画像をグレースケール化します。

Matクラス

OpenCVでは画像の色などのデータをMatクラスで管理します。(Matクラスの詳細な情報はこちらを参照して下さい。)

Androidで使用する場合はBitmapToMatメソッドを使用してBitmapからMatクラスを生成する必要があります。

Mat mat = android.BitmapToMat([変換元のBitmapオブジェクト]);

また、MatクラスとBitmapToMatメソッドを使用するためには下記のパッケージをインポートする必要があります。

import org.opencv.android;
import org.opencv.core.Mat;

Matクラスは色情報を管理していますが、画像そのものではないので、画面に表示するにはMatToBitmapメソッドを使用してBitmapに変換する必要があります。

android.MatToBitmap([変換元のMatオブジェクト],[変換先のBitmap]);

グレースケール変換を行う

では実際に画像をグレースケール変換してみましょう。

下記はSDカード直下にある”test.jpg”というファイルからBitmapを生成して、グレスケール変換を行い、ImageViewに表示するサンプルです。

Bitmap bmp = BitmapFactory.decodeFile(Environment.getExternalStorageDirectory().getAbsolutePath() + "/test.jpg").copy(Bitmap.Config.ARGB_8888, true);

Mat mat = android.BitmapToMat(bmp);

Imgproc.cvtColor(mat, mat, Imgproc.COLOR_RGB2GRAY);
Imgproc.cvtColor(mat, mat, Imgproc.COLOR_GRAY2RGBA, 4);

android.MatToBitmap(mat, bmp);

ImageView iv = (ImageView) findViewById(R.id.imageview01);
iv.setImageBitmap(bmp);

5行目でcvtColorメソッドにImgproc.COLOR_RGB2GRAY定数を渡してしてカラー画像からグレー画像に変換しています。
Imgprocクラスを使用するためには下記をインポートに追加する必要があります。

import org.opencv.imgproc.Imgproc;

6行目で、グレスケール画像からRGBA画像に変換しています。
グレスケールを行ったままのMatの状態ではBitmapに変換することは不可能なため、この処理が必要になります。