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

【Java】OpenCVの適応的しきい値処理(Adaptive Threshold)をサンプルコードで解説


適応的しきい値処理とは

しきい値処理(Thresholding)は、画像をセグメンテーションするためのシンプルな手法で、二値画像を作成する目的でよく利用されます。この処理では、あらかじめ指定したしきい値よりも大きい画素値が、一定の標準値へと置き換えられます。

一方、適応的しきい値処理(Adaptive Thresholding)は、画像を小さな領域に分割し、それぞれの領域ごとにしきい値を算出する手法です。そのため、領域ごとに異なるしきい値が適用され、照明のムラがある画像などでも効果的に二値化できます。

adaptiveThreshold() メソッドを使用すると、指定した画像に対して適応的しきい値処理を実行できます。このメソッドの主なパラメータは以下のとおりです。

  • ソース画像と出力画像を表す2つの Mat オブジェクト
  • しきい値を表す整数値
  • 適応手法としきい値の種類を表す2つの整数値
  • しきい値の計算に使用する近傍ピクセル領域のサイズを表す整数値
  • 各手法の計算で加算される定数を表す double 型の値

サンプルコード

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 AdaptiveThreshold extends Application {
    public void start(Stage stage) throws IOException {
       // OpenCVのコアライブラリを読み込みます
       System.loadLibrary( Core.NATIVE_LIBRARY_NAME );
       String file ="D:\\Images\\win2.jpg";
       Mat src = Imgcodecs.imread(file, Imgcodecs.IMREAD_GRAYSCALE);
       // 出力画像を格納するための空のMatオブジェクトを作成します
       Mat dst = new Mat(src.rows(), src.cols(), src.type());
       // 適応的しきい値処理を適用します
       Imgproc.adaptiveThreshold(src, dst, 125,
       Imgproc.ADAPTIVE_THRESH_MEAN_C,
       Imgproc.THRESH_BINARY, 11, 12);
       // 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("Adaptive Threshold");
       stage.setScene(scene);
       stage.show();
    }
    public static void main(String args[]) {
       launch(args);
    }
}

入力画像

【Java】OpenCVの適応的しきい値処理(Adaptive Threshold)をサンプルコードで解説

実行結果

上記のプログラムを実行すると、以下のようなウィンドウが表示されます。

【Java】OpenCVの適応的しきい値処理(Adaptive Threshold)をサンプルコードで解説


  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(