JavaとOpenCVによる画像のヒストグラム均等化(平坦化)の実装方法
画像のヒストグラムとは、ピクセルの輝度値(明るさ)が出現する頻度を視覚的に表したものです。画像のヒストグラムでは、横軸(X軸)にグレーレベルの輝度値、縦軸(Y軸)にそれぞれの輝度値の出現頻度がプロットされます。
ヒストグラム均等化(ヒストグラム平坦化)を行うことで、偏りのある輝度分布を全体的に引き伸ばし、画像のコントラストを改善することができます。暗すぎる画像や明るすぎる画像を見やすくしたい場合に特に有効な手法です。
equalizeHist()メソッドについて
OpenCVのImgprocクラスが提供するequalizeHist()メソッドを使用すると、簡単にヒストグラム均等化を実行できます。このメソッドは、ソース画像とデスティネーション(出力先)画像を表す2つのMatオブジェクトを引数として受け取ります。処理を実行すると、ソース行列のヒストグラムが均等化され、その結果がデスティネーション行列に格納されます。
メソッドの構文
Imgproc.equalizeHist(ソース画像(Mat), 出力先画像(Mat));
サンプルコード
以下は、JavaFXアプリケーション内でOpenCVを使用して、画像のヒストグラム均等化を行い、結果を画面に表示する完全なサンプルコードです。
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 HistogramEquilization 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 dst = new Mat(src.rows(), src.cols(), src.type());
// ヒストグラムを均等化する
Imgproc.equalizeHist(src, dst);
// 行列を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("Histogram Equilization Example");
stage.setScene(scene);
stage.show();
}
public static void main(String args[]) {
launch(args);
}
}入力画像

実行結果
上記のコードを実行すると、以下のような出力が得られます。元画像と比較して、コントラストが明確に改善されていることが確認できます。

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