Ngưỡng thích ứng tính giá trị ngưỡng cho các vùng nhỏ, do đó các vùng khác nhau có ngưỡng khác nhau.
Phương thức adaptiveThreshold() thực hiện ngưỡng thích ứng. Tham số:
- Hai Mat: ảnh nguồn, đích.
- Int: giá trị ngưỡng tối đa.
- Hai int: phương pháp thích ứng (ADAPTIVE_THRESH_MEAN_C hoặc GAUSSIAN_C) và loại ngưỡng (THRESH_BINARY).
- Int: kích thước lân cận pixel (block size).
- Double: hằng số trừ đi từ trung bình/trọng số.
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 AdaptiveThreshold 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());
// Adaptive Threshold: MEAN_C, BINARY, blockSize=11, C=12
Imgproc.adaptiveThreshold(src, dst, 125,
Imgproc.ADAPTIVE_THRESH_MEAN_C,
Imgproc.THRESH_BINARY, 11, 12);
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("Adaptive 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: 