OpenCVとJavaFXで画像の明るさを下げる方法:convertTo()メソッドの実装例
Javaで画像の明るさを変更する方法の一つとして、OpenCVのconvertTo()メソッドを使う手法があります。このメソッドは、指定された行列(Mat)に対して必要な計算を実行し、画像のコントラストや明るさを調整します。convertTo()メソッドは以下の4つのパラメータを受け取ります。
- mat − 結果を格納するための空の行列。元の行列と同じサイズ・型である必要があります。
- rtype − 出力行列の型を指定する整数値。負の値を指定した場合、出力行列の型は元の行列と同じになります。
- alpha − ゲイン値。0より大きい値である必要があります(デフォルト値は1)。
- beta − バイアス値(デフォルト値は0)。
パラメータbetaに負の値(0〜-255)を設定すると、画像の明るさが低下します。つまり、各ピクセルの輝度値からbetaの値が差し引かれ、全体的に暗い画像が生成されます。
実装例
以下は、JavaFXのスライダーを操作してリアルタイムに画像の明るさを下げるサンプルプログラムです。スライダーの値に応じてalphaとbetaが計算され、convertTo()メソッドによって処理された画像が画面に表示されます。
import java.awt.image.BufferedImage;
import java.io.ByteArrayInputStream;
import java.io.IOException;
import java.io.InputStream;
import javafx.application.Application;
import javafx.beans.value.ChangeListener;
import javafx.beans.value.ObservableValue;
import javafx.embed.swing.SwingFXUtils;
import javafx.geometry.Insets;
import javafx.scene.Scene;
import javafx.scene.control.Label;
import javafx.scene.control.Slider;
import javafx.scene.image.ImageView;
import javafx.scene.image.WritableImage;
import javafx.scene.layout.VBox;
import javafx.stage.Stage;
import javax.imageio.ImageIO;
import org.opencv.core.Core;
import org.opencv.core.Mat;
import org.opencv.core.MatOfByte;
import org.opencv.imgcodecs.Imgcodecs;
public class DecreasingBrightnessJavaFX extends Application {
double contrast = 1;
private final int rtype = -1;
double alpha = 1;
double beta = 0;
Slider slider1;
int sliderMinVal = 0;
int sliderMaxVal = 255;
int sliderInitVal = 255;
Mat src = null;
public void start(Stage stage) throws IOException {
// OpenCVコアライブラリのロード
System.loadLibrary( Core.NATIVE_LIBRARY_NAME );
String file ="D:\\Image\\cuba.jpg";
src = Imgcodecs.imread(file);
WritableImage writableImage = loadImage(src);
// ImageViewの設定
ImageView imageView = new ImageView(writableImage);
imageView.setX(25);
imageView.setY(25);
imageView.setFitHeight(400);
imageView.setFitWidth(550);
imageView.setPreserveRatio(true);
// スライダーの設定
slider1 = new Slider(sliderMinVal, sliderMaxVal, sliderInitVal);
slider1.setShowTickLabels(true);
slider1.setShowTickMarks(true);
slider1.setMajorTickUnit(25);
slider1.setBlockIncrement(10);
// ラベルの設定
Label label1 = new Label();
Label label2 = new Label();
// スライダー用のリスナー
slider1.valueProperty().addListener(new ChangeListener<Number>() {
public void changed(ObservableValue <?extends Number>observable, Number
oldValue, Number newValue){
try {
alpha = newValue.doubleValue();
Mat dest = new Mat(src.rows(), src.cols(), src.type());
alpha = (alpha/sliderMaxVal);
beta = 1.0 - alpha;
label1.setText("α-value: " + alpha);
label2.setText("β-value: " + beta);
src.convertTo(dest, rtype, alpha, beta);
imageView.setImage(loadImage(dest));
}
catch(Exception e) {
System.out.println("");
}
}
});
// 3つのコンポーネントを配置するVBox
VBox vbox = new VBox();
vbox.setPadding(new Insets(20));
vbox.setSpacing(10);
vbox.getChildren().addAll(label1, label2, slider1, imageView);
// シーンオブジェクトの作成
Scene scene = new Scene(vbox, 600, 450);
stage.setTitle("Decreasing an image");
stage.setScene(scene);
stage.show();
}
public WritableImage loadImage(Mat image) throws IOException {
MatOfByte matOfByte = new MatOfByte();
Imgcodecs.imencode(".jpg", image, matOfByte);
// エンコードしたMatをバイト配列に格納
byte[] byteArray = matOfByte.toArray();
// 画像の表示
InputStream in = new ByteArrayInputStream(byteArray);
BufferedImage bufImage = ImageIO.read(in);
WritableImage writableImage = SwingFXUtils.toFXImage(bufImage, null);
return writableImage;
}
public static void main(String args[]) {
launch(args);
}
}入力画像

出力画像

処理のポイント
このプログラムでは、スライダーの値(0〜255)を最大値255で割ることでalpha値を算出し、さらに「1.0 − alpha」でbeta値を求めています。スライダーを左に動かすほどalphaが小さくなり、betaとの組み合わせによって画像が徐々に暗くなっていきます。MatオブジェクトをJavaFXで表示するために、一度JPEG形式でエンコードし、BufferedImageを経由してWritableImageに変換している点も重要なポイントです。
-
JavaFXとOpenCVで画像の明るさとコントラストを変更する方法
OpenCVのorg.opencv.core.Matクラスが提供するconvertTo()メソッドを使うと、画像の明るさやコントラストを簡単に調整できます。このメソッドは、出力先の行列(空のMat)、出力データ型(rtype)、ゲイン(alpha)、オフセット(beta)の順に4つの引数を受け取ります。 各ピクセルの値は「α × 元の画素値 + β」という式で変換されるため、alphaでコントラスト、betaで明るさがそれぞれ制御されます。具体的な調整方法は以下の通りです。 明るさを上げる場合:beta値を0から正方向(最大255)へ増やします(alpha値は1のまま)。 明るさを下げる場
-
Java OpenCVライブラリを使って画像の明るさを変更する方法
OpenCVのorg.opencv.core.Matクラスが提供するconvertTo()メソッドを使うと、行列に対して必要な演算を実行し、画像のコントラストや明るさを簡単に調整できます。このメソッドは以下の4つのパラメータを受け取ります。 mat − 計算結果を格納するための空の行列。ソース行列と同じサイズ・型である必要があります。 rtype − 出力行列の型を指定する整数値。負の値を指定した場合は、ソース行列と同じ型になります。 alpha − ゲイン値。0より大きい値を指定します(デフォルトは1)。この値を変更するとコントラストに影響します。 beta − バイアス値(デフォルトは