画像の一部のみを処理する

『画像の一部のみを処理する』このテーマを OpenCv CookBookでは 例によってROIを用いて処理しています。残念ながらAndroid版ではこの手法は取れそうにありません。そこで『画像をネガポジ反転する』で取り上げた CoreクラスのBit演算のメソッドを使って実現することにしました。使ったメソッドは 次の3つのメソッドです。

static void bitwise_and(Mat src1, Mat src2, Mat dst)
static void bitwise_not(Mat src, Mat dst)
static void bitwise_or(Mat src1, Mat src2, Mat dst)

 実行結果 

画像の一部として矩形を扱っているものが多いのですが、どのようなMaskを描画するかで自由に処理できます。今回は試しに円形にし その内側をグレースケール化してみます。

コーディング

Mat gray = mat.clone();
Imgproc.cvtColor(gray , gray, Imgproc.COLOR_RGB2GRAY); 
Imgproc.cvtColor(gray , gray, Imgproc.COLOR_GRAY2BGRA,4);
// maskを定義する mask画像の形で処理結果の表示エリアを自由に制御できます
Mat mask = new Mat(mat.rows(), mat.cols(), mat.type(), new Scalar(0,0,0));
Core.circle(mask, new Point(mask.cols()/2,mask.rows()/2),mask.cols()/3, new Scalar(255,255,255),-1);
Core.bitwise_and(gray, mask, gray);// グレースケール化した画像は mask部分のみ残します
Core.bitwise_not(mask, mask);       // maskを反転します 
Core.bitwise_and(mat, mask, mat); // 元画像からmask部分を除去して背景画像を準備します
Mat dst = new Mat();
Core.bitwise_or(mat, gray, dst);     // 処理した画像と元の背景部分を合成します

ここで matはもとの画像 dstは 合成結果です。
処理結果を下に示します。(上段:元の画像 下段:処理結果)

このbit演算を使うと まだ実験はして見ませんが 前回取り上げた『画像をつなげる』こともできるような気がします。

 by Android2.2 with OpenCv 2.3.1 for Android
スポンサーリンク
Rectangle大広告
Rectangle大広告

シェアする

  • このエントリーをはてなブックマークに追加

フォローする