Java OpenCv Lv10〜画像の平均輝度をだす〜

イントロダクション

読み込んだ画像を変換して再表示する処理の続きになります。下のメソッドは配列の平均値を求めるものです。

前回に引き続きメソッドの処理を実行して処理を確認します。

「C++」cvAvg() => 「Java」Core.mean()

参考サイト:OpenCV Code Example(サンプル)

すごくわかりづらいけど、少し濃いめの灰色になったようです。

ソース

public static void main(String[] args) {
	long start = System.currentTimeMillis();
	// 画像を2枚読み込む
	Mat src = Imgcodecs.imread(OpenCVTest12.class.getResource("/images/4color.png").getPath());
	Scalar scalar = Core.mean(src);
	// 論理演算処理を行う
	Mat dst = new Mat(new Size(50, 50), CvType.CV_8UC1, scalar);
	ViewFrame frame = new ViewFrame(dst);
	System.out.println("実行時間: " + (System.currentTimeMillis() - start) + "ミリ秒");
}

これもやっぱり、よくわかりませんでした。画像=数値の配列という認識はありますが根本的に「どんなことを計算しているか?」の部分を理解する必要があるようです。

関連ページ一覧

  1. Java Install Eclipse〜開発ツールのインストール〜
  2. Java OpenCV 環境セットアップ(on Mac)
  3. Java 初めてでも大丈夫〜ステップアッププログラミングのススメ〜JavaFXでのハローワールド〜OpenCVのチュートリアル迄続きます。

今までにやったこと(OpenCV編)

  1. Java OpenCV 環境セットアップ(on Mac)
  2. Java OpenCv Lv1 〜入門: 写真の表示〜
  3. Java OpenCV Lv2 〜画像を表示する〜
  4. Java OpenCV Lv3 〜画像の平滑化(smooth())〜
  5. Java OpenCV Lv3 〜画像にガウシアンフィルタ(GaussianBlur())〜
  6. Java OpenCV Lv4 〜画像の中身をみてみる〜
  7. Java OpenCV Lv5 〜Matクラスで描画処理〜
  8. Java OpenCV Lv6 〜Matクラスで背景から作成してみる〜
  9. Java OpenCV Lv7 〜MatクラスでEllipseしてみる〜
  10. Java OpenCV Lv9 〜画像編集「足し算」(cvAdd)〜
  11. Java OpenCV Lv9 〜画像編集「引き算」(cvSubtract)〜
  12. Java OpenCV Lv9 〜画像の掛け算〜
  13. Java OpenCV Lv10 〜行列演算Mat#submat()〜
  14. Java OpenCv Lv10〜画像の平均値をだす〜

[rakuten ids="rise-store:10000000"]

Java OpenCV Lv10 〜画像の論理演算〜

イントロダクション

前回は、Mat#submat()を実行してみました。元の画像データを切り抜きその部分に変更を加えるものでした。

今回は、Core#bitwise_and()を実行してみます。

Java OpenCV Lv9 〜画像の掛け算〜

画像の論理演算「AND演算処理」

本を読むと、描く配列ごとの論理積の結果を出力するようです。つまり「掛け算」ということです。前々回やったような?些細なことは放っておき。。。

シンプルに実行した結果を記載いたします。

<実行結果>

 +  = 

<上の絵が見えないとき用>



2つの画像が合体したような感じです。どっかでみたような結果だな・・・

 

上でやったのと同じ結果だな(元にした画像は違います)

使用したメソッドは下のものです。パラメータも多く細かい調整が可能です。

Core.addWeighted(src, 0.5, cart, 0.5, 0, dst);

今回使用したのは下のソースコード赤い字の部分です。

<ソース> ※Gitからダウンロードできます

/**
 * メインメソッド、書き方は決まっている。
 * イメージファイルを読み込んで線を引く
 * 
 * @param argsプログラム引数
 */
public static void main(String[] args) {
	long start = System.currentTimeMillis();
	// 画像を2枚読み込む
	Mat src = Imgcodecs.imread(OpenCVTest11.class.getResource("/images/4color.png").getPath());
	Mat cart = Imgcodecs.imread(OpenCVTest11.class.getResource("/images/racgaki2.png").getPath());
	// 論理演算処理を行う
	Mat dst = new Mat();
	Core.bitwise_and(src, cart, dst);
	ViewFrame frame = new ViewFrame(dst);
	System.out.println("実行時間: " + (System.currentTimeMillis() - start) + "ミリ秒");
}

まとめ

アルファブレンド(addWeighted)の調整値(param)を上のコードと同じように実行すると論理積と同じ結果でる。

画像処理を行うときは、それぞれ適当な方法を洗濯して使用する。。。というところでしょうか。

でわでわ。。。

関連ページ一覧

  1. ava Install Eclipse〜開発ツールのインストール〜
  2. TensorFlow C++環境〜EclipseにCDTをインストール〜
  3. Setup OpenGL with Java〜JOGLを使う準備 for Eclipse〜
  4. Eclipse Meven 開発手順〜プロジェクトの作成〜
  5. Java OpenCV 環境セットアップ(on Mac)

今までにやったこと(OpenCV編)

  1. Java OpenCv Lv1 〜入門: 写真の表示〜
  2. Java OpenCV Lv2 〜画像を表示する〜
  3. Java OpenCV Lv3 〜画像の平滑化(smooth())〜
  4. Java OpenCV Lv3 〜画像にガウシアンフィルタ(GaussianBlur())〜
  5. Java OpenCV Lv4 〜画像の中身をみてみる〜
  6. Java OpenCV Lv5 〜Matクラスで描画処理〜
  7. Java OpenCV Lv6 〜Matクラスで背景から作成してみる〜
  8. Java OpenCV Lv7 〜MatクラスでEllipseしてみる〜
  9. Java OpenCV Lv9 〜画像編集「足し算」(cvAdd)〜
  10. Java OpenCV Lv9 〜画像編集「引き算」(cvSubtract)〜
  11. Java OpenCV Lv9 〜画像の掛け算〜
  12. Java OpenCV Lv10 〜行列演算Mat#submat()〜
  13. Java OpenCv Lv10〜画像の平均値をだす〜

Java OpenCV Lv10 〜行列演算Mat#submat()〜

イントロダクション

Lv9では、画像(行列=Mat)の足し算と引き算、アルファブレンド(掛け算?)をやりました。

ここからは、ドラクエⅢ的にいうならば地下世界に突入します。

Lv9でやった「足し算」と「引き算」はバラモスのようなものでまぁ本番前の前哨戦と言ったところです。

今回の目玉

Lv9の処理でやったものは条件があり、演算するときにサイズを同じにする必要があります。(50x50, 100x100など)これはあまり実践的ではありませんので「策」が必要です。

「策」とは?

シンプルに、画像のサイズが違うなら一部を抜き出してしまえば良いのです。 ※調べているうちに気がつきました(笑)

つまりMat#subMat()を使用するということです。

ちょっと手こずりましたが、基本ですね。。。何が言いたいかというと

今回使用したMat#submat()は抜き出したMat(ROI)の参照を持っているのでいちいち変換処理の後に元の画像データに戻してやる必要がない(※参照渡しになっている)ということでした。参考サイトはstackoverflow

<実行結果>



<ソース> ※Gitからダウンロードできます

public static void main(String[] args) {
	long start = System.currentTimeMillis();
	// mountain.png(798x503)
	Mat src = Imgcodecs.imread(OpenCVTest9_Substract.class.getResource("/images/mountain.png").getPath());
        // rakugaki.png(50x50)
	Mat cart = Imgcodecs.imread(OpenCVTest9_Substract.class.getResource("/images/racgaki2.png").getPath());
	Rect rect = new Rect(600, 400, 50, 50);
        // 変更したい部分を切り抜く
	Mat roi = src.submat(rect);
	// 抜き出した部分に掛け算を行う(アルファブレンドを行う)
	Core.addWeighted(roi, 0.5, cart, 0.5, 0, roi);
               // 掛け算を行なったとき、元の画像データの抜き出した部分を変更しているので「src」をそのまま表示
	ViewFrame frame = new ViewFrame(src);
	System.out.println("実行時間: " + (System.currentTimeMillis() - start) + "ミリ秒");
}

関連ページ一覧

  1. Java Install Eclipse〜開発ツールのインストール〜
  2. TensorFlow C++環境〜EclipseにCDTをインストール〜
  3. Setup OpenGL with Java〜JOGLを使う準備 for Eclipse〜
  4. Eclipse Meven 開発手順〜プロジェクトの作成〜
  5. Java OpenCV 環境セットアップ(on Mac)

今までにやったこと(OpenCV編)

  1. Java OpenCV 環境セットアップ(on Mac)
  2. Java OpenCv Lv1 〜入門: 写真の表示〜
  3. Java OpenCV Lv2 〜画像を表示する〜
  4. Java OpenCV Lv3 〜画像の平滑化(smooth())〜
  5. Java OpenCV Lv3 〜画像にガウシアンフィルタ(GaussianBlur())〜
  6. Java OpenCV Lv4 〜画像の中身をみてみる〜
  7. Java OpenCV Lv5 〜Matクラスで描画処理〜
  8. Java OpenCV Lv6 〜Matクラスで背景から作成してみる〜
  9. Java OpenCV Lv7 〜MatクラスでEllipseしてみる〜
  10. Java OpenCV Lv9 〜画像編集「足し算」(cvAdd)〜
  11. Java OpenCV Lv9 〜画像編集「引き算」(cvSubtract)〜
  12. Java OpenCV Lv9 〜画像の掛け算〜
  13. Java OpenCV Lv10 〜行列演算Mat#submat()〜
  14. Java OpenCv Lv10〜画像の平均値をだす〜

重宝するページ:JavaDoc(opencv-343.jar API)

[rakuten ids="mtgec-beauty:10001062"]

Java OpenCV Lv9 〜画像の掛け算〜

イントロダクション

このところ、画像の計算を行なっております。

  1. Java OpenCV Lv9 〜画像編集「足し算」(cvAdd)〜
  2. Java OpenCV Lv9 〜画像編集「引き算」(cvSubtract)〜

足し算、引き算。。。とくれば「掛け算」でしょう。というわけで掛け算やります。

画像のアルファブレンド(掛け算?)

とりあえず「アルファブレンド」の意味がわからないので調べます。

ついでに「アルファチャンネル」も理解する必要アリのようです。

まずは実行して見ます。

 +  = 

これが、始めイメージしていた「足し算」でしたが、どうやら「掛け算」にあたるようです。


ソース>※GItからダウンロードできます。

public static void main(String[] args) {
	long start = System.currentTimeMillis();
	// 真っ白な画像から引き算してみる
	Mat src = Imgcodecs.imread(OpenCVTest9_Substract.class.getResource("/images/rakugaki.png").getPath());
	Mat cart = Imgcodecs.imread(OpenCVTest9_Substract.class.getResource("/images/racgaki2.png").getPath());
	System.out.println("*** First ****");
	System.out.println(src.dump());
	Mat dst = new Mat();
	Core.addWeighted(src, 0.5, cart, 0.5, 0, dst);
	System.out.println("*** Second ****");
	System.out.println(dst.dump());
	ViewFrame frame = new ViewFrame(dst);
	System.out.println("実行時間: " + (System.currentTimeMillis() - start) + "ミリ秒");
}

結果を見てみて

今までやってきた画像の計算に関しては、計算するときに画像のサイズを合わせる必要がある、が100x100の画像と20x20の画像を掛け算(アルファブレンド)したいときは、ROIで画像の切り抜きを行えば問題なしです。

関連ページ一覧

  1. Java Install Eclipse〜開発ツールのインストール〜
  2. TensorFlow C++環境〜EclipseにCDTをインストール〜
  3. Setup OpenGL with Java〜JOGLを使う準備 for Eclipse〜
  4. Eclipse Meven 開発手順〜プロジェクトの作成〜
  5. Java OpenCV 環境セットアップ(on Mac)

今までにやったこと(OpenCV編)

  1. Java OpenCV 環境セットアップ(on Mac)
  2. Java OpenCv Lv1 〜入門: 写真の表示〜
  3. Java OpenCV Lv2 〜画像を表示する〜
  4. Java OpenCV Lv3 〜画像の平滑化(smooth())〜
  5. Java OpenCV Lv3 〜画像にガウシアンフィルタ(GaussianBlur())〜
  6. Java OpenCV Lv4 〜画像の中身をみてみる〜
  7. Java OpenCV Lv5 〜Matクラスで描画処理〜
  8. Java OpenCV Lv6 〜Matクラスで背景から作成してみる〜
  9. Java OpenCV Lv7 〜MatクラスでEllipseしてみる〜
  10. Java OpenCV Lv9 〜画像編集「足し算」(cvAdd)〜
  11. Java OpenCV Lv9 〜画像編集「引き算」(cvSubtract)〜
  12. Java OpenCV Lv9 〜画像の掛け算〜
  13. Java OpenCV Lv10 〜行列演算Mat#submat()〜
  14. Java OpenCv Lv10〜画像の平均値をだす〜

重宝するページ:JavaDoc(opencv-343.jar API)

Java OpenCV Lv9 〜画像編集「引き算」(cvSubtract)〜

イントロダクション

前回に引き続き、引き算を行います。

【前回】:Java OpenCV Lv9 〜画像編集「引き算」(cvSubtract)〜

ポイントA

前回の実行結果より「画像」と言っても所詮は数値型の配列だった

→「0=黒」「255=白」なので「0」の領域に「255」を足したら白くなる

 +  = 

<上の絵が見えない時用のIMG>

見た目的に下の部分が黒く残っても良さそうですが。。。

黒(0)に白(255)足したら残るのは極わずかになるか…

気を取り直し引き算する

ポイントB

前回の結果から「足し算」したら0「黒」が255「白」になった。

というわけで、白(255)から中間の色(値)を引き算してみようと思います。

真っ白の画像から下の落書きを引き算します。

今までは「黒(0)」か「白(255)」だったので他の色を使用して見ました。

<実行結果>


<ソース>

public static void main(String[] args) {
	long start = System.currentTimeMillis();
	// 真っ白な画像から引き算してみる
	Mat src = Imgcodecs.imread(OpenCVTest9_Substract.class.getResource("/images/white50x50.png").getPath());
	Mat cart = Imgcodecs.imread(OpenCVTest9_Substract.class.getResource("/images/racgaki2.png").getPath());
	System.out.println("*** First ****");
	System.out.println(src.dump());
	Mat dst = new Mat();
	Core.subtract(src, cart, dst);
	System.out.println("*** Second ****");
	System.out.println(dst.dump());
	ViewFrame frame = new ViewFrame(dst);
	System.out.println("実行時間: " + (System.currentTimeMillis() - start) + "ミリ秒");
}

うーむ、白い部分が引き算されたら黒(0)になるな。。。当たり前か?

今回は簡単ですが終わります。次は掛け算です。

次はアルファブレンド(掛け算?)です。

関連ページ一覧

  1. Java Install Eclipse〜開発ツールのインストール〜
  2. TensorFlow C++環境〜EclipseにCDTをインストール〜
  3. Setup OpenGL with Java〜JOGLを使う準備 for Eclipse〜
  4. Eclipse Meven 開発手順〜プロジェクトの作成〜
  5. Java OpenCV 環境セットアップ(on Mac)

今までにやったこと(OpenCV編)

  1. Java OpenCV 環境セットアップ(on Mac)
  2. Java OpenCv Lv1 〜入門: 写真の表示〜
  3. Java OpenCV Lv2 〜画像を表示する〜
  4. Java OpenCV Lv3 〜画像の平滑化(smooth())〜
  5. Java OpenCV Lv3 〜画像にガウシアンフィルタ(GaussianBlur())〜
  6. Java OpenCV Lv4 〜画像の中身をみてみる〜
  7. Java OpenCV Lv5 〜Matクラスで描画処理〜
  8. Java OpenCV Lv6 〜Matクラスで背景から作成してみる〜
  9. Java OpenCV Lv7 〜MatクラスでEllipseしてみる〜
  10. Java OpenCV Lv9 〜画像編集「足し算」(cvAdd)〜
  11. Java OpenCV Lv9 〜画像編集「引き算」(cvSubtract)〜
  12. Java OpenCV Lv9 〜画像の掛け算〜
  13. Java OpenCV Lv10 〜行列演算Mat#submat()〜
  14. Java OpenCv Lv10〜画像の平均値をだす〜

重宝するページ:JavaDoc(opencv-343.jar API)