Java
 Computer >> コンピューター >  >> プログラミング >> Java

OpenCVで画像をマスキングするとは?filter2D()を使ったフィルタリングの基本と実装例

OpenCVにおけるマスキング(フィルタリング)とは

マスク処理(Mask Operation)とは、あらかじめ用意したマスク行列(カーネル)に基づいて、画像内の各ピクセルの値を再計算する処理のことです。この手法は一般にフィルタリングとも呼ばれています。

OpenCVでは、Imgprocクラスのfilter2D()メソッドを使うことで、簡単にマスキングやフィルタリングを実現できます。このメソッドは、入力画像(ソース)、出力画像(デスティネーション)、そしてカーネル行列の3つを引数として受け取り、ソース行列とカーネル行列の畳み込み演算を行います。

主な用途

  • シャープ化(輪郭を強調)
  • ぼかし処理(平滑化)
  • エッジ検出

実装例:Javaでfilter2D()を使う

以下は、2種類のカーネルを使って画像をフィルタリングするJavaのサンプルコードです。

import org.opencv.core.Core;
import org.opencv.core.CvType;
import org.opencv.core.Mat;
import org.opencv.highgui.HighGui;
import org.opencv.imgcodecs.Imgcodecs;
import org.opencv.imgproc.Imgproc;

public class MaskingExample {
    public static void main( String[] args ) {
        // OpenCVのコアライブラリを読み込む
        System.loadLibrary( Core.NATIVE_LIBRARY_NAME );

        // 入力画像を読み込む
        String file = "D://images//boy.jpg";
        Mat src = Imgcodecs.imread(file);

        // 結果を格納する空の行列を作成
        Mat dst = new Mat();

        // カーネル1を作成(シャープ化用)
        Mat kernel1 = new Mat(3, 3, CvType.CV_8S);
        int row = 0, col = 0;
        kernel1.put(row, col, 0, -1, 0, -1, 5, -1, 0, -1, 0);

        // カーネル2を作成(平均化・ぼかし用)
        Mat kernel2 = Mat.ones(2, 2, CvType.CV_32F);
        for(int i = 0; i < kernel2.rows(); i++) {
            for(int j = 0; j < kernel2.cols(); j++) {
                double[] m = kernel2.get(i, j);
                for(int k = 1; k < m.length; k++) {
                    m[k] = m[k] / (2 * 2);
                }
                kernel2.put(i, j, m);
            }
        }

        // カーネル1で画像をフィルタリング
        Imgproc.filter2D(src, dst, -1, kernel1);
        HighGui.imshow("Mask Example1", dst);
        dst = new Mat();

        // カーネル2で画像をフィルタリング
        Imgproc.filter2D(src, dst, -1, kernel2);
        HighGui.imshow("Mask Example2", dst);
        HighGui.waitKey();
    }
}

コードのポイント

  • kernel1:中心が5、周囲が-1の3×3行列で、シャープ化フィルタとして機能します。画像の輪郭がくっきりと強調されます。
  • kernel2:全要素が1/4の2×2行列で、平均化フィルタ(ぼかし)として機能します。画像全体がなめらかになります。

入力画像

OpenCVで画像をマスキングするとは?filter2D()を使ったフィルタリングの基本と実装例

実行結果

上記プログラムを実行すると、以下のようなウィンドウが表示されます。

カーネル1(シャープ化)の結果:OpenCVで画像をマスキングするとは?filter2D()を使ったフィルタリングの基本と実装例

カーネル2(ぼかし)の結果:OpenCVで画像をマスキングするとは?filter2D()を使ったフィルタリングの基本と実装例

まとめ

OpenCVのfilter2D()メソッドを使えば、カーネル行列を変えるだけでシャープ化やぼかしなど、さまざまな画像処理を柔軟に実装できます。マスキングの仕組みを理解することは、より高度な画像処理技術への第一歩となるでしょう。

  1. OpenCVで画像に楕円を描画する方法|cv2.ellipse()の使い方を解説

    この記事では、Pythonの画像処理ライブラリ「OpenCV」を使って、画像の上に楕円を描画する方法を解説します。楕円の描画には、OpenCVが提供する cv2.ellipse() 関数を使用します。元画像アルゴリズム(処理の手順)楕円を描画するまでの流れは、以下の手順になります。ステップ1: cv2 をインポートする。 ステップ2: imread() で画像を読み込む。 ステップ3: 楕円の中心座標を設定する。 ステップ4: 楕円の長軸・短軸の長さ(axesLength)を設定する。 ステップ5: 楕円の回転角度(angle)を設定する。 ステップ6: 描画を開始する角度と終了する角度を設定

  2. OpenCVを使って画像に線を描画する方法

    この記事では、OpenCVのcv2.line()関数を使用して、画像にシンプルな線を描画する方法を解説します。線の始点・終点・太さ・色を自由に指定できるので、図形の描画や注釈の追加など、さまざまな場面で活用できます。 元画像 処理の流れ(アルゴリズム) ステップ1:cv2をインポートする。 ステップ2:imread()で画像を読み込む。 ステップ3:image.shapeメソッドで画像のサイズ(高さ・幅・チャンネル数)を取得する。 ステップ4:線の始点を定義する。 ステップ5:線の終点を定義する。 ステップ6:線の太さを定義する。 ステップ7:cv2.line()関数で線を描画し、ステップ3