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

แอปพลิเคชัน JavaFX ปรับความคมชัดของภาพด้วย OpenCV

การเพิ่มความคมชัดของภาพ (Sharpening) คือกระบวนการตรงข้ามกับการเบลอ (Blur) ใน OpenCV ทำได้โดยการเบลอภาพด้วย Gaussian filter แล้วลบภาพที่เบลอออกจากภาพต้นฉบับ

ตัวอย่างโปรแกรม 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.core.Size;
import org.opencv.imgcodecs.Imgcodecs;
import org.opencv.imgproc.Imgproc;

public class SharpnessJavaFX extends Application {
    double alpha = 1;
    double beta = 0;
    Slider slider1, slider2;
    Mat src = null;

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

        ImageView imageView = new ImageView(writableImage);
        imageView.setFitHeight(400);
        imageView.setFitWidth(550);
        imageView.setPreserveRatio(true);

        Label label1 = new Label("Alpha value");
        slider1 = new Slider(0.1, 3, 1);
        slider1.setShowTickLabels(true);
        slider1.setShowTickMarks(true);
        slider1.setMajorTickUnit(1);
        slider1.setBlockIncrement(0.05);

        Label label2 = new Label();
        Label label3 = new Label("Beta value");
        slider2 = new Slider(-2, 2, 0);
        slider2.setShowTickLabels(true);
        slider2.setShowTickMarks(true);
        slider2.setMajorTickUnit(1);
        slider2.setBlockIncrement(0.5);

        Label label4 = new Label();

        slider1.valueProperty().addListener((obs, oldVal, newVal) -> {
            try {
                label2.setText("α-value: " + newVal);
                alpha = newVal.doubleValue();
                Mat dest = new Mat(src.rows(), src.cols(), src.type());
                Imgproc.GaussianBlur(src, dest, new Size(0,0), 10);
                Core.addWeighted(src, alpha, dest, beta, 0, dest);
                imageView.setImage(loadImage(dest));
            } catch(Exception e) { e.printStackTrace(); }
        });

        slider2.valueProperty().addListener((obs, oldVal, newVal) -> {
            try {
                label4.setText("β-value: " + newVal);
                beta = newVal.doubleValue();
                Mat dest = new Mat(src.rows(), src.cols(), src.type());
                Imgproc.GaussianBlur(src, dest, new Size(0,0), 10);
                Core.addWeighted(src, alpha, dest, beta, 0, dest);
                imageView.setImage(loadImage(dest));
            } catch(Exception e) { e.printStackTrace(); }
        });

        VBox vbox = new VBox(10, label1, slider1, label2, imageView, label3, slider2, label4);
        vbox.setPadding(new Insets(20));
        Scene scene = new Scene(vbox, 600, 560);
        stage.setTitle("ปรับความคมชัดของภาพ");
        stage.setScene(scene);
        stage.show();
    }

    public WritableImage loadImage(Mat image) throws IOException {
        MatOfByte matOfByte = new MatOfByte();
        Imgcodecs.imencode(".jpg", image, matOfByte);
        byte[] byteArray = matOfByte.toArray();
        InputStream in = new ByteArrayInputStream(byteArray);
        BufferedImage bufImage = ImageIO.read(in);
        return SwingFXUtils.toFXImage(bufImage, null);
    }

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

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

โปรแกรมแสดง GUI ที่ปรับค่า alpha และ beta เพื่อควบคุมความคมชัดของภาพได้แบบเรียลไทม์