2012年2月14日火曜日

色空間を変換する - OpenCV for Android


色空間の変換ということですが、そもそも色空間ってなんでしょう?

Google先生に聞いてみると、「色」を数値の組合せで表現する方法を指すようで、RGBと言われればイメージしやすいですね。
RGBは色を赤(R)・緑(G)・青(B)の3つの色の組み合わせで表現するおなじみのヤツです。

では、まずは画像の表示です。
[drawable]フォルダに適当なpng画像を放り込みます。
BitmapFactoryのstaticメソッド、decodeResourceメソッドでBitmapクラスのオブジェクトを作成します。
Bitmap src = BitmapFactory.decodeResource(getResources(),
  R.drawable.chromeicon);

続いてUtils.bitmapToMatメソッドでBitmapをMatに変換します。
Mat mat = Utils.bitmapToMat(src);

あとは同じ手順で画像を表示出来ます。


画像がうまく表示されたら、画像を表示する前に色空間を変換してみましょう。
色空間を変換するには、Imgproc.cvtColor(src, dst, code)を使います。

そう、前回BGRAからRGBAへ変換したあのメソッドです。
もう既に色空間の変換を行っていた訳ですね。
Imgproc.cvtColor(mat , mat, Imgproc.COLOR_RGB2YUV);

変換後の画像を表示してみると。。。

うーん。。。また何か降臨してしまいました。
いくつか試してみようということで、第3引数を色々と変更してみます。
Imgproc.cvtColor(mat, mat, Imgproc.COLOR_RGB2BGRA);


結局4チャンネルのBGRAで出力しなくてはいけないということでしょうか?

一度何かに変換後に、再度BGRAに変換してみます。
Imgproc.cvtColor(mat, mat, Imgproc.COLOR_RGB2YUV);
Imgproc.cvtColor(mat, mat, Imgproc.COLOR_YUV2BGR, 4);


グレースケール。
Imgproc.cvtColor(mat, mat, Imgproc.COLOR_RGB2GRAY);
Imgproc.cvtColor(mat, mat, Imgproc.COLOR_GRAY2BGRA, 4);


概ねうまくいったような気がします。

0 コメント:

コメントを投稿