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

【Java × OpenCV】Scharr演算子によるエッジ検出の実装例を解説

Scharr(シャール)演算子は、画像中のエッジ(輪郭)を水平方向・垂直方向の両方で検出できる手法です。Sobel演算子を改良したもので、特に小さなカーネルサイズにおいて精度の高い微分値を得られる点が特徴です。

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

  • 入力画像(ソース)と出力画像(デスティネーション)を表す2つのMatオブジェクト
  • 画像のビット深度(ddepth)を表す整数値
  • 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 ScharrEdgeDetection {
    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を作成
        Mat dst = new Mat();

        // x方向の微分次数:0、y方向:1 でScharrフィルタを適用
        Imgproc.Scharr(src, dst, Imgproc.CV_SCHARR, 0, 1);
        HighGui.imshow("Scharr - x:0 & y:1", dst);

        // x方向の微分次数:1、y方向:0 でScharrフィルタを適用
        Imgproc.Scharr(src, dst, Imgproc.CV_SCHARR, 1, 0);
        HighGui.imshow("Scharr - x:1 & y:0", dst);

        HighGui.waitKey();
    }
}

入力画像

【Java × OpenCV】Scharr演算子によるエッジ検出の実装例を解説

実行結果

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

Scharr - x:0 & y:1(垂直方向のエッジを強調):
【Java × OpenCV】Scharr演算子によるエッジ検出の実装例を解説

Scharr - x:1 & y:0(水平方向のエッジを強調):
【Java × OpenCV】Scharr演算子によるエッジ検出の実装例を解説

このように、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)。 サンプルコード 以下は、白紙の画