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

OpenCVでSobelエッジ検出を実装するJavaサンプルコードの解説

Sobel(ソーベル)演算子によるエッジ検出は、画像内のエッジを水平方向と垂直方向の両方から検出できる手法です。輪郭や物体の境界線を抽出したい場合に広く利用されています。

OpenCVでは、ImgprocクラスのSobel()メソッドを呼び出すことで、指定した画像にSobelエッジ検出アルゴリズムを適用できます。このメソッドには以下の引数を渡します。

  • 元画像(ソース)と出力画像(デスティネーション)を表す2つのMatオブジェクト
  • 画像のビット深度を表す整数値(-1を指定すると元画像と同じ深度になります)
  • x方向とy方向の微分次数を保持する2つのdouble型変数

サンプルコード

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

public class SobelEdgeDetection {
    public static void main(String args[]) {
        // OpenCVのコアライブラリを読み込む
        System.loadLibrary( Core.NATIVE_LIBRARY_NAME );
        String file ="D:\\Images\\win2.jpg";
        Mat src = Imgcodecs.imread(file);

        // 出力画像用の空の行列を作成する
        Mat dst = new Mat();

        // x:0、y:1 のSobel微分を適用(垂直方向のエッジを検出)
        Imgproc.Sobel(src, dst, -1, 0, 1);
        HighGui.imshow("Sobel - x:0 & y:1 ", dst);
        HighGui.waitKey();

        // x:1、y:0 のSobel微分を適用(水平方向のエッジを検出)
        Imgproc.Sobel(src, dst, -1, 1, 0);
        HighGui.imshow("Sobel - x:1 & y:0 ", dst);
        HighGui.waitKey();

        // x:1、y:1 のSobel微分を適用(両方向のエッジを検出)
        Imgproc.Sobel(src, dst, -1, 1, 1);
        HighGui.imshow("Sobel - x:1 & y:1 ", dst);
        HighGui.waitKey();
    }
}

実行結果

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

Sobel – x:0 & y:1(垂直方向のエッジが強調される)

OpenCVでSobelエッジ検出を実装するJavaサンプルコードの解説

Sobel – x:1 & y:0(水平方向のエッジが強調される)

OpenCVでSobelエッジ検出を実装するJavaサンプルコードの解説

Sobel – x:1 & y:1(両方向のエッジが強調される)

OpenCVでSobelエッジ検出を実装するJavaサンプルコードの解説

このように、x・yの微分次数の組み合わせを変えるだけで、検出したいエッジの方向を柔軟に制御できます。実際の開発では、ノイズ除去のためのガウシアンブラー処理を前段に挟むことで、より安定したエッジ検出結果が得られます。

  1. JavaとOpenCVで長方形を描画する方法|Imgproc.rectangle()の使い方を徹底解説

    Java用OpenCVライブラリの org.opencv.imgproc パッケージには、Imgproc クラスが含まれています。画像に長方形を描画するには、このクラスが提供する rectangle() メソッドを使用します。 このメソッドは以下のパラメータを受け取ります。 Matオブジェクト:長方形を描画する対象となる画像を表します。 Pointオブジェクト(2つ):描画する長方形の対角となる2つの頂点座標を表します。 Scalarオブジェクト:長方形の色をBGR形式で指定します。 整数値:長方形の枠線の太さを指定します(デフォルト値は1)。 サンプルコード 以下は、白紙の画像に長方形を

  2. JavaとOpenCVで線を描画する方法をわかりやすく解説

    Java版OpenCVライブラリのorg.opencv.imgprocパッケージには、Imgprocというクラスが含まれています。画像に直線を描画するには、このクラスが提供するline()メソッドを呼び出します。 line()メソッドのパラメータ line()メソッドは、以下のパラメータを受け取ります。 Matオブジェクト ― 直線を描画する対象となる画像を表します。 Pointオブジェクト2つ ― 直線の始点と終点の座標を表します。 Scalarオブジェクト ― 直線の色をBGR形式で指定します。 整数値 ― 直線の太さを指定します(デフォルト値:1)。 サンプルコード 以下は、白紙の画