『画像の一部のみを処理する』このテーマを 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 |