Computer >> Hướng Dẫn Máy Tính >  >> Lập Trình >> Java

Điều chỉnh độ sáng và độ tương phản hình ảnh bằng JavaFX và OpenCV


Phương thức convertTo() của lớp org.opencv.core.Mat chấp nhận 4 tham số theo thứ tự: mat (ma trận rỗng), rtype (nguyên), alpha (nguyên), beta (nguyên).

  • Tăng độ sáng – Giảm giá trị beta từ 0 về -255 (giữ alpha = 1).

  • Giảm độ sáng – Tăng giá trị beta từ 0 lên 255 (giữ alpha = 1).

  • Tăng độ tương phản – Tăng giá trị alpha từ 1 lên 100 (giữ beta = 0).

  • Giảm độ tương phản – Giảm giá trị alpha từ 1 xuống 0 (giữ beta = 0).

Ví dụ

Dưới đây là chương trình JavaFX với hai thanh trượt để điều chỉnh giá trị alpha và beta.

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 AlphaBetaValuesJavaFX extends Application {
double contrast = 1;
private final int rtype = -1;
double alpha = 1;
double beta = 0;
Slider slider1;
Slider slider2;
Mat src = null;

public void start(Stage stage) throws IOException {
// Tải thư viện lõi OpenCV
System.loadLibrary(Core.NATIVE_LIBRARY_NAME);
String file = "D:\\Image\\lamma2.jpg";
src = Imgcodecs.imread(file);
WritableImage writableImage = loadImage(src);
// Thiết lập ImageView
ImageView imageView = new ImageView(writableImage);
imageView.setX(50);
imageView.setY(25);
imageView.setFitHeight(400);
imageView.setFitWidth(550);
imageView.setPreserveRatio(true);
Label label1 = new Label("Giá trị Alpha");
// Thiết lập Slider
slider1 = new Slider(0.1, 3, 1);
slider1.setShowTickLabels(true);
slider1.setShowTickMarks(true);
slider1.setMajorTickUnit(1);
slider1.setBlockIncrement(0.05);
// Thiết lập Label
Label label2 = new Label();
Label label3 = new Label("Giá trị Beta");
// Thiết lập Slider
slider2 = new Slider(-100, 100, 0);
slider2.setShowTickLabels(true);
slider2.setShowTickMarks(true);
slider2.setMajorTickUnit(25);
slider2.setBlockIncrement(10);
// Thiết lập Label
Label label4 = new Label();
// Listener cho slider alpha
slider1.valueProperty().addListener(new ChangeListener<Number>() {
public void changed(ObservableValue<? extends Number> observable, Number oldValue, Number newValue) {
try {
label2.setText("α-value: " + newValue);
alpha = newValue.doubleValue();
Mat dest = new Mat(src.rows(), src.cols(), src.type());
src.convertTo(dest, rtype, alpha, beta);
imageView.setImage(loadImage(dest));
} catch (Exception e) {
System.out.println("");
}
}
});
// Listener cho slider beta
slider2.valueProperty().addListener(new ChangeListener<Number>() {
public void changed(ObservableValue<? extends Number> observable, Number oldValue, Number newValue) {
try {
label4.setText("β-value: " + newValue);
beta = newValue.doubleValue();
Mat dest = new Mat(src.rows(), src.cols(), src.type());
src.convertTo(dest, rtype, alpha, beta);
imageView.setImage(loadImage(dest));
} catch (Exception e) {
System.out.println("");
}
}
});
// VBox để sắp xếp các thành phần
VBox vbox = new VBox();
vbox.setPadding(new Insets(20));
vbox.setSpacing(10);
vbox.getChildren().addAll(label1, slider1, label2, imageView, label3, slider2, label4);
// Tạo Scene
Scene scene = new Scene(vbox, 600, 580);
stage.setTitle("Tải hình ảnh");
stage.setScene(scene);
stage.show();
}

public WritableImage loadImage(Mat image) throws IOException {
MatOfByte matOfByte = new MatOfByte();
Imgcodecs.imencode(".jpg", image, matOfByte);
// Lưu ma trận đã mã hóa vào mảng byte
byte[] byteArray = matOfByte.toArray();
// Hiển thị hình ảnh
InputStream in = new ByteArrayInputStream(byteArray);
BufferedImage bufImage = ImageIO.read(in);
System.out.println("Ảnh đã tải");
WritableImage writableImage = SwingFXUtils.toFXImage(bufImage, null);
return writableImage;
}

public static void main(String args[]) {
launch(args);
}
}

Ảnh đầu vào

Điều chỉnh độ sáng và độ tương phản hình ảnh bằng JavaFX và OpenCV

Ảnh đầu ra

Điều chỉnh độ sáng và độ tương phản hình ảnh bằng JavaFX và OpenCV