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

OpenCVによる画像の膨張(Dilation)処理 – Javaサンプルコードで学ぶ

モルフォロジー演算とは

収縮(Erosion)と膨張(Dilation)は、モルフォロジー演算における2つの基本操作です。その名のとおり、モルフォロジー演算とは、画像をその「形状」に基づいて処理する一連の操作を指します。

膨張(Dilation)の仕組み

膨張処理では、画像の境界部分に新たなピクセルが追加されます。このとき追加されるピクセルの総数は、使用する構造要素(カーネル)の寸法によって決まります。白い領域が太くなるため、ノイズ除去後の小さな穴を埋めたり、オブジェクト同士をつなげたりする用途に役立ちます。

OpenCVでは、Imgproc クラスが提供する dilate() メソッドを使うことで、簡単に画像を膨張できます。このメソッドは、入力画像(ソース)、出力画像(デスティネーション)、そしてカーネルを表す3つの Mat オブジェクトを受け取ります。

実装例

以下は、JavaFXアプリケーション内でOpenCVの dilate() メソッドを呼び出し、処理結果をウィンドウに表示するサンプルコードです。

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.core.Size;
import org.opencv.highgui.HighGui;
import org.opencv.imgcodecs.Imgcodecs;
import org.opencv.imgproc.Imgproc;
public class ImageDilation extends Application {
    public void start(Stage stage) throws IOException {
       // OpenCVコアライブラリの読み込み
       System.loadLibrary( Core.NATIVE_LIBRARY_NAME );
       // 画像データの読み込み
       String file ="D:\\Images\\lamma2.jpg";
       Mat src = Imgcodecs.imread(file);
       // 出力用マトリックスの作成
       Mat dst = new Mat(src.rows(), src.cols(), src.type());
       // カーネル(構造要素)マトリックスの準備
       Mat kernel = Imgproc.getStructuringElement(Imgproc.MORPH_RECT, new Size((2*2) + 1, (2*2)+1));
       // 画像へのdilate適用
       Imgproc.dilate(src, dst, kernel);
       // マトリックスをJavaFXの書き込み可能イメージへ変換
       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("Dilation Example");
       stage.setScene(scene);
       stage.show();
    }
    public static void main(String args[]) {
       launch(args);
    }
}

コードのポイント

  • System.loadLibrary(): OpenCVネイティブライブラリを読み込みます。
  • getStructuringElement(): MORPH_RECT を指定して5×5の矩形カーネルを作成しています。MORPH_ELLIPSE や MORPH_CROSS なども選択可能です。
  • dilate(): 入力画像に対してカーネルを適用し、膨張結果を出力マトリックスに格納します。

入力画像

OpenCVによる画像の膨張(Dilation)処理 – Javaサンプルコードで学ぶ

実行結果

上記のプログラムを実行すると、次のような出力が得られます。元画像に比べて白い領域が広がり、全体が明るく太くなっていることが確認できます。

OpenCVによる画像の膨張(Dilation)処理 – Javaサンプルコードで学ぶ

  1. OpenCVとJavaFXで画像の明るさを下げる方法:convertTo()メソッドの実装例

    Javaで画像の明るさを変更する方法の一つとして、OpenCVのconvertTo()メソッドを使う手法があります。このメソッドは、指定された行列(Mat)に対して必要な計算を実行し、画像のコントラストや明るさを調整します。convertTo()メソッドは以下の4つのパラメータを受け取ります。mat − 結果を格納するための空の行列。元の行列と同じサイズ・型である必要があります。rtype − 出力行列の型を指定する整数値。負の値を指定した場合、出力行列の型は元の行列と同じになります。alpha − ゲイン値。0より大きい値である必要があります(デフォルト値は1)。beta − バイアス値(デ

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

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