Javaサンプルコードで解説!OpenCVの距離変換(Distance Transform)の使い方
距離変換(Distance Transform)とは
距離変換は、デジタル画像から派生させた表現方法の一つです。この処理では、前景領域内にある各点のグレーレベル輝度値を、「0」の値(境界)までの最短距離へと置き換えます。その結果、物体の中心部ほど明るく、境界に近いほど暗く表示される画像が生成され、形状解析やセグメンテーションなどに活用できます。
OpenCVでは、ImgprocクラスのdistanceTransform()メソッドを使用することで、指定した画像に距離変換を適用できます。このメソッドは、以下の引数を受け取ります。
- ソース画像と出力先画像を表す2つのMatオブジェクト
- 適用する距離変換の種類を表す整数値(例:DIST_L1=マンハッタン距離、DIST_L2=ユークリッド距離、DIST_C=チェビシェフ距離など)
- 計算に使用するマスクサイズを表す整数値(通常は3または5)
なお、距離変換は二値画像に対して適用するのが一般的なため、事前にthreshold()メソッドで画像を二値化しておきます。また、結果は浮動小数点型で出力されるため、Core.convertScaleAbs()メソッドを使って8ビットの符号なし整数型に変換すると、画像として扱いやすくなります。
Javaでの実装例
import java.awt.Image;
import java.awt.image.BufferedImage;
import java.io.IOException;
import javafx.application.Application;
import javafx.embed.swing.SwingFXUtils;
import javafx.scene.Group;
import javafx.scene.Scene;
import javafx.scene.image.ImageView;
import javafx.scene.image.WritableImage;
import javafx.stage.Stage;
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 DistanceTransform extends Application {
public void start(Stage stage) throws IOException {
// OpenCVのコアライブラリを読み込む
System.loadLibrary( Core.NATIVE_LIBRARY_NAME );
// ファイルから画像を読み込み、Matオブジェクトとして格納する
String file ="D://images//boy.jpg";
Mat src = Imgcodecs.imread(file, Imgcodecs.IMREAD_GRAYSCALE);
// 結果を格納するための空のMatオブジェクトを作成する
Mat dst = new Mat();
Mat binary = new Mat();
// グレースケール画像を二値画像に変換する
Imgproc.threshold(src, binary, 100, 255, Imgproc.THRESH_BINARY);
// 距離変換を適用する
Imgproc.distanceTransform(binary, dst, Imgproc.DIST_C, 3);
Core.convertScaleAbs( dst, dst );
// MatをJavaFXのWritableImageに変換する
Image img = HighGui.toBufferedImage(dst);
WritableImage writableImage= SwingFXUtils.toFXImage((BufferedImage) img, null);
// ImageViewを設定する
ImageView imageView = new ImageView(writableImage);
imageView.setX(10);
imageView.setY(10);
imageView.setFitWidth(575);
imageView.setPreserveRatio(true);
// Sceneオブジェクトを設定する
Group root = new Group(imageView);
Scene scene = new Scene(root, 595, 400);
stage.setTitle("Distance Transform");
stage.setScene(scene);
stage.show();
}
public static void main(String args[]) {
launch(args);
}
}入力画像

出力結果
上記のプログラムを実行すると、次のようなウィンドウが表示されます。前景領域の中心ほど明るく描画され、距離変換が正しく適用されていることが確認できます。

-
JavaとOpenCVライブラリを使って画像内の顔を検出する方法
JavaでOpenCVを使用して画像から顔を検出するには、CascadeClassifierクラスを利用します。このクラスは、分類器ファイル(カスケードファイル)を読み込み、画像内から目的のオブジェクト(ここでは顔)を検出する役割を担います。 CascadeClassifierクラスとは CascadeClassifierは、OpenCVが提供する物体検出用のクラスです。事前に学習済みのカスケード分類器(XMLファイル)を読み込むことで、顔や人など特定のパターンを画像から認識できます。 detectMultiScale()メソッドについて このクラスが持つdetectMultiScale(
-
JavaとOpenCVライブラリを使って画像を保存(書き出し)する方法
OpenCVライブラリを利用すると、画像フィルタリング、幾何学的変換、色空間の変換、ヒストグラム処理など、さまざまな画像処理操作を行うことができます。本記事では、その中でも基本的な操作である「画像の読み込みと保存(書き出し)」の方法を解説します。画像を書き出す(保存する)方法Imgcodecsクラスのimread()メソッドを使って画像を読み込むと、その内容はMat(Matrix)オブジェクトに格納されます。読み込んだ画像をファイルとして保存するには、imwrite()メソッドを使用します。imwrite()メソッドは、以下の2つの引数を受け取ります。file:保存先のファイルパスを表す文字列