Computer >> Máy Tính >  >> Lập trình >> Java

Ví dụ về JavaFX để giảm độ sáng của hình ảnh bằng OpenCV.


Một cách để thay đổi độ sáng của hình ảnh bằng Java là sử dụng convertTo () phương pháp. Phương pháp này thực hiện các phép tính cần thiết trên ma trận đã cho để thay đổi độ tương phản và độ sáng của hình ảnh. Phương thức này chấp nhận 4 tham số -

  • thảm - Ma trận trống để chứa kết quả có cùng kích thước và kiểu với ma trận nguồn.

  • rtype - giá trị số nguyên xác định kiểu của ma trận đầu ra. Nếu giá trị này là âm, loại sẽ giống với nguồn.

  • alpha - Giá trị tăng, phải lớn hơn 0 (giá trị mặc định 1).

  • beta - Giá trị thiên vị (giá trị mặc định 0).

nếu giá trị đã chọn cho thông số beta là một giá trị âm (0 đến -255) độ sáng của hình ảnh bị giảm.

Ví dụ

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 {
      //Loading the OpenCV core library
      System.loadLibrary( Core.NATIVE_LIBRARY_NAME );
      String file ="D:\\Image\\cuba.jpg";
      src = Imgcodecs.imread(file);
      WritableImage writableImage = loadImage(src);
      //Setting the image view
      ImageView imageView = new ImageView(writableImage);
      imageView.setX(25);
      imageView.setY(25);
      imageView.setFitHeight(400);
      imageView.setFitWidth(550);
      imageView.setPreserveRatio(true);
      //Setting the slider
      slider1 = new Slider(sliderMinVal, sliderMaxVal, sliderInitVal);
      slider1.setShowTickLabels(true);
      slider1.setShowTickMarks(true);
      slider1.setMajorTickUnit(25);
      slider1.setBlockIncrement(10);
      //Setting the label
      Label label1 = new Label();
      Label label2 = new Label();
      //Listener for the slider
      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("");
            }
         }
      });
      //VBox to arrange all the three components
      VBox vbox = new VBox();
      vbox.setPadding(new Insets(20));
      vbox.setSpacing(10);
      vbox.getChildren().addAll(label1, label2, slider1, imageView);
      //Creating a scene object
      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);
      //Storing the encoded Mat in a byte array
      byte[] byteArray = matOfByte.toArray();
      //Displaying the image
      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);
   }
}

Đầu vào

Ví dụ về JavaFX để giảm độ sáng của hình ảnh bằng OpenCV.

Đầu ra

Ví dụ về JavaFX để giảm độ sáng của hình ảnh bằng OpenCV.