Computer >> บทช่วยสอนคอมพิวเตอร์ >  >> การเขียนโปรแกรม >> Java

ปรับความสว่างและคอนทราสต์ภาพด้วย JavaFX และ OpenCV

เมธอด convertTo() ของคลาส org.opencv.core.Mat ใช้ปรับความสว่างและคอนทราสต์ รับ 4 พารามิเตอร์: mat, rtype, alpha, beta

  • เพิ่มความสว่าง - ลดค่า beta จาก 0 ไป -255 (alpha = 1)

  • ลดความสว่าง - เพิ่มค่า beta จาก 0 ไป 255 (alpha = 1)

  • เพิ่มคอนทราสต์ - เพิ่มค่า alpha จาก 1 ไป 100 (beta = 0)

  • ลดคอนทราสต์ - ลดค่า alpha จาก 1 ไป 0 (beta = 0)

ตัวอย่างโปรแกรม JavaFX

มีสไลด์เดอร์ 2 ตัวสำหรับ alpha และ 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 AlphaBetaJavaFX extends Application {
    double alpha = 1, beta = 0;
    Slider slider1, slider2;
    Mat src = null;
    final int rtype = -1;

    public void start(Stage stage) throws IOException {
        System.loadLibrary(Core.NATIVE_LIBRARY_NAME);
        src = Imgcodecs.imread("D:\\Image\\lamma2.jpg");
        WritableImage img = loadImage(src);

        ImageView view = new ImageView(img);
        view.setFitHeight(400);
        view.setFitWidth(550);
        view.setPreserveRatio(true);

        slider1 = new Slider(0.1, 3, 1);
        slider1.setShowTickLabels(true);
        slider1.setShowTickMarks(true);
        slider1.setMajorTickUnit(1);
        slider1.setBlockIncrement(0.05);

        slider2 = new Slider(-100, 100, 0);
        slider2.setShowTickLabels(true);
        slider2.setShowTickMarks(true);
        slider2.setMajorTickUnit(25);
        slider2.setBlockIncrement(10);

        Label l1 = new Label("Alpha"), l2 = new Label(), l3 = new Label("Beta"), l4 = new Label();

        slider1.valueProperty().addListener((obs, o, n) -> {
            try {
                alpha = n.doubleValue();
                l2.setText("α: " + alpha);
                Mat dest = new Mat(src.rows(), src.cols(), src.type());
                src.convertTo(dest, rtype, alpha, beta);
                view.setImage(loadImage(dest));
            } catch(Exception e) { e.printStackTrace(); }
        });

        slider2.valueProperty().addListener((obs, o, n) -> {
            try {
                beta = n.doubleValue();
                l4.setText("β: " + beta);
                Mat dest = new Mat(src.rows(), src.cols(), src.type());
                src.convertTo(dest, rtype, alpha, beta);
                view.setImage(loadImage(dest));
            } catch(Exception e) { e.printStackTrace(); }
        });

        VBox box = new VBox(10, l1, slider1, l2, view, l3, slider2, l4);
        box.setPadding(new Insets(20));
        stage.setScene(new Scene(box, 600, 580));
        stage.setTitle("ปรับความสว่างและคอนทราสต์");
        stage.show();
    }

    WritableImage loadImage(Mat m) throws IOException {
        MatOfByte mob = new MatOfByte();
        Imgcodecs.imencode(".jpg", m, mob);
        return SwingFXUtils.toFXImage(ImageIO.read(new ByteArrayInputStream(mob.toArray())), null);
    }

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

ภาพอินพุตและเอาต์พุต

GUI แสดงภาพพร้อมสไลด์เดอร์ปรับ alpha (คอนทราสต์) และ beta (ความสว่าง) แบบเรียลไทม์