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

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の距離変換(Distance Transform)の使い方

出力結果

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

Javaサンプルコードで解説!OpenCVの距離変換(Distance Transform)の使い方

  1. JavaとOpenCVライブラリを使って画像内の顔を検出する方法

    JavaでOpenCVを使用して画像から顔を検出するには、CascadeClassifierクラスを利用します。このクラスは、分類器ファイル(カスケードファイル)を読み込み、画像内から目的のオブジェクト(ここでは顔)を検出する役割を担います。 CascadeClassifierクラスとは CascadeClassifierは、OpenCVが提供する物体検出用のクラスです。事前に学習済みのカスケード分類器(XMLファイル)を読み込むことで、顔や人など特定のパターンを画像から認識できます。 detectMultiScale()メソッドについて このクラスが持つdetectMultiScale(

  2. JavaとOpenCVライブラリを使って画像を保存(書き出し)する方法

    OpenCVライブラリを利用すると、画像フィルタリング、幾何学的変換、色空間の変換、ヒストグラム処理など、さまざまな画像処理操作を行うことができます。本記事では、その中でも基本的な操作である「画像の読み込みと保存(書き出し)」の方法を解説します。画像を書き出す(保存する)方法Imgcodecsクラスのimread()メソッドを使って画像を読み込むと、その内容はMat(Matrix)オブジェクトに格納されます。読み込んだ画像をファイルとして保存するには、imwrite()メソッドを使用します。imwrite()メソッドは、以下の2つの引数を受け取ります。file:保存先のファイルパスを表す文字列