Ngưỡng (Thresholding) là kỹ thuật đơn giản để phân đoạn hình ảnh, thường dùng tạo ảnh nhị phân. Các pixel lớn hơn giá trị ngưỡng sẽ được thay bằng giá trị chuẩn.
- Ngưỡng đơn giản: Giá trị ngưỡng cố định cho toàn bộ ảnh.
- Ngưỡng thích ứng: Tính ngưỡng cho các vùng nhỏ, khác nhau cho từng vùng.
Kỹ thuật Otsu: Giá trị ngưỡng được xác định tự động, chọn ngưỡng tối ưu dựa trên histogram ảnh.
Phương thức threshold() của lớp Imgproc nhận: hai Mat (nguồn, đích), hai int (ngưỡng, giá trị chuẩn), int (loại ngưỡng). Để dùng Otsu, truyền Imgproc.THRESH_OTSU làm loại kỹ thuật.
Ví dụ minh họa
import java.awt.Image;
import java.awt.image.BufferedImage;
import java.io.IOException;
import javafx.application.Application;
import javafx.embed.swing.SwingFXUtils;
import javafx.scene.Group;
import javafx.scene.Scene;
import javafx.scene.image.ImageView;
import javafx.scene.image.WritableImage;
import javafx.stage.Stage;
import org.opencv.core.Core;
import org.opencv.core.Mat;
import org.opencv.highgui.HighGui;
import org.opencv.imgcodecs.Imgcodecs;
import org.opencv.imgproc.Imgproc;
public class OtsuThresholding extends Application {
@Override
public void start(Stage stage) throws IOException {
System.loadLibrary(Core.NATIVE_LIBRARY_NAME);
String file = "D:\\Images\\win2.jpg";
Mat src = Imgcodecs.imread(file, Imgcodecs.IMREAD_GRAYSCALE);
Mat dst = new Mat(src.rows(), src.cols(), src.type());
// Áp dụng Otsu threshold
Imgproc.threshold(src, dst, 50, 255, Imgproc.THRESH_OTSU);
// Chuyển đổi sang JavaFX Image
Image img = HighGui.toBufferedImage(dst);
WritableImage writableImage = SwingFXUtils.toFXImage((BufferedImage) img, null);
ImageView imageView = new ImageView(writableImage);
imageView.setX(10);
imageView.setY(10);
imageView.setFitWidth(575);
imageView.setPreserveRatio(true);
Group root = new Group(imageView);
Scene scene = new Scene(root, 595, 400);
stage.setTitle("Otsu Threshold");
stage.setScene(scene);
stage.show();
}
public static void main(String[] args) {
launch(args);
}
}
Hình ảnh đầu vào và kết quả
Input: 
Output: 