【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();
}
}
入力画像

実行結果
上記のプログラムを実行すると、以下のウィンドウが表示されます。
Scharr - x:0 & y:1(垂直方向のエッジを強調):

Scharr - x:1 & y:0(水平方向のエッジを強調):

このように、x方向とy方向の微分次数の組み合わせを変更することで、検出したいエッジの向きを切り替えることができます。実際の画像処理アプリケーションでは、両方向の結果を組み合わせることで、より精度の高い輪郭抽出が可能になります。
-
JavaとOpenCVで長方形を描画する方法|Imgproc.rectangle()の使い方を徹底解説
Java用OpenCVライブラリの org.opencv.imgproc パッケージには、Imgproc クラスが含まれています。画像に長方形を描画するには、このクラスが提供する rectangle() メソッドを使用します。 このメソッドは以下のパラメータを受け取ります。 Matオブジェクト:長方形を描画する対象となる画像を表します。 Pointオブジェクト(2つ):描画する長方形の対角となる2つの頂点座標を表します。 Scalarオブジェクト:長方形の色をBGR形式で指定します。 整数値:長方形の枠線の太さを指定します(デフォルト値は1)。 サンプルコード 以下は、白紙の画像に長方形を
-
JavaとOpenCVで線を描画する方法をわかりやすく解説
Java版OpenCVライブラリのorg.opencv.imgprocパッケージには、Imgprocというクラスが含まれています。画像に直線を描画するには、このクラスが提供するline()メソッドを呼び出します。 line()メソッドのパラメータ line()メソッドは、以下のパラメータを受け取ります。 Matオブジェクト ― 直線を描画する対象となる画像を表します。 Pointオブジェクト2つ ― 直線の始点と終点の座標を表します。 Scalarオブジェクト ― 直線の色をBGR形式で指定します。 整数値 ― 直線の太さを指定します(デフォルト値:1)。 サンプルコード 以下は、白紙の画