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

【Java×OpenCV】形態学的クロージング(Morphological Closing)の使い方をサンプルコード付きで解説


モルフォロジー演算(形態学的操作)とは

モルフォロジー演算とは、指定された形状(構造要素)に基づいて画像を処理する一連の操作のことです。収縮(エロージョン)と膨張(ダイレーション)は、その中でも最も基本的な2つのモルフォロジー演算です。

  • 膨張(ダイレーション)では、画像の境界部分にピクセルが追加されます。

  • 収縮(エロージョン)では、画像の境界部分からピクセルが除去されます。

追加・除去されるピクセルの総数は、使用する構造要素(カーネル)の寸法によって決まります。OpenCVでは、erode()メソッドとdilate()メソッドを使用することで、それぞれ収縮と膨張の処理を実行できます。

さらにOpenCVでは、これらの基本操作に加えて、オープニング、クロージング、モルフォロジーグラディエント、トップハット、ブラックハットといったさまざまなモルフォロジー変換が提供されています。

形態学的クロージング(Morphological Closing)とは

形態学的クロージングとは、まず画像に膨張(ダイレーション)を適用し、その結果に対して収縮(エロージョン)を適用する操作のことです。この処理により、画像内の小さな穴や黒い点状のノイズを埋めて除去できます。

端的に言えば、形態学的クロージングは画像からノイズを除去するための手法です。なお、カーネルサイズを大きくするほど大きなノイズや穴を埋められる一方で、画像の細部も失われやすくなるため、用途に合わせたサイズの選択が重要になります。

この処理を画像に適用するには、morphologyEx()メソッドを使用します。このメソッドは以下の引数を受け取ります。

  • 入力画像と出力画像を表す2つのMatオブジェクト

  • 適用するモルフォロジー演算の種類を表す整数値

  • カーネル行列を表すMatオブジェクト

画像に対してクロージング処理を適用するには、上記のメソッドを呼び出す際に第3パラメータとしてImgproc.MORPH_CLOSEを指定し、あわせて入力画像・出力画像・カーネル行列を渡します。

サンプルコード

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.CvType;
import org.opencv.core.Mat;
import org.opencv.highgui.HighGui;
import org.opencv.imgcodecs.Imgcodecs;
import org.opencv.imgproc.Imgproc;

public class MorphologicalClosing extends Application {
   public void start(Stage stage) throws IOException {
      // OpenCVのコアライブラリを読み込みます
      System.loadLibrary( Core.NATIVE_LIBRARY_NAME );
      // 画像データを読み込みます
      String file ="D:\\Images\\morph_input2.jpg";
      Mat src = Imgcodecs.imread(file);
      // 出力用の行列を作成します
      Mat dst = new Mat(src.rows(), src.cols(), src.type());
      // カーネル行列オブジェクトを準備します
      Mat kernel = Mat.ones(5,5, CvType.CV_32F);
      // 画像にクロージング処理を適用します
      Imgproc.morphologyEx(src, dst, Imgproc.MORPH_CLOSE, kernel);
      // 行列を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("Closing Example");
      stage.setScene(scene);
      stage.show();
   }
   public static void main(String args[]) {
      launch(args);
   }
}

入力画像

【Java×OpenCV】形態学的クロージング(Morphological Closing)の使い方をサンプルコード付きで解説

実行結果

上記のプログラムを実行すると、以下のような出力が得られます。

【Java×OpenCV】形態学的クロージング(Morphological Closing)の使い方をサンプルコード付きで解説

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

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

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

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