OpenCV - Cân bằng biểu đồ

Các histogramcủa một hình ảnh cho biết tần số của các giá trị cường độ pixel. Trong biểu đồ hình ảnh, trục X hiển thị các cường độ màu xám và trục Y hiển thị tần suất của các cường độ này.

Histogram equalizationcải thiện độ tương phản của hình ảnh, để mở rộng phạm vi cường độ. Bạn có thể cân bằng biểu đồ của một hình ảnh nhất định bằng phương phápequalizeHist() sau đó Imgproclớp học. Sau đây là cú pháp của phương thức này.

equalizeHist(src, dst)

Phương thức này chấp nhận các tham số sau:

  • src - Một đối tượng của lớp Mat đại diện cho hình ảnh nguồn (đầu vào).

  • dst - Một đối tượng của lớp Matđại diện cho đầu ra. (Hình ảnh thu được sau khi cân bằng biểu đồ)

Thí dụ

Chương trình sau đây trình bày cách cân bằng biểu đồ của một hình ảnh nhất định.

import java.util.ArrayList;
import java.util.List;

import org.opencv.core.Core;
import org.opencv.core.Mat;
import org.opencv.core.Size;
import org.opencv.imgcodecs.Imgcodecs;
import org.opencv.imgproc.Imgproc;

public class HistoTest {
   public static void main (String[] args) {
      // Loading the OpenCV core library
      System.loadLibrary( Core.NATIVE_LIBRARY_NAME );

      // Reading the Image from the file and storing it in to a Matrix object
      String file ="E:/OpenCV/chap20/histo_input.jpg";

      // Load the image
      Mat img = Imgcodecs.imread(file);

      // Creating an empty matrix
      Mat equ = new Mat();
      img.copyTo(equ);

      // Applying blur
      Imgproc.blur(equ, equ, new Size(3, 3));

      // Applying color
      Imgproc.cvtColor(equ, equ, Imgproc.COLOR_BGR2YCrCb);
      List<Mat> channels = new ArrayList<Mat>();

      // Splitting the channels
      Core.split(equ, channels);

      // Equalizing the histogram of the image
      Imgproc.equalizeHist(channels.get(0), channels.get(0));
      Core.merge(channels, equ);
      Imgproc.cvtColor(equ, equ, Imgproc.COLOR_YCrCb2BGR);

      Mat gray = new Mat();
      Imgproc.cvtColor(equ, gray, Imgproc.COLOR_BGR2GRAY);
      Mat grayOrig = new Mat();
      Imgproc.cvtColor(img, grayOrig, Imgproc.COLOR_BGR2GRAY);

      Imgcodecs.imwrite("E:/OpenCV/chap20/histo_output.jpg", equ);
      System.out.println("Image Processed");
   }
}

Giả sử rằng sau đây là hình ảnh đầu vào histo_input.jpg được chỉ định trong chương trình trên.

Đầu ra

Khi thực hiện chương trình, bạn sẽ nhận được kết quả sau:

Image Processed

Nếu bạn mở đường dẫn được chỉ định, bạn có thể quan sát hình ảnh đầu ra như sau: