自适应阈值.TRIANGLE
对于阈值 *** 作,不仅可以手动设置阈值,还可以自动计算阈值,即根据输入源本身特征进行自适应阈值。本节自适应为TRIANGLE。TRIANGLE的含义为将灰度输入源的直方图寻找其最大峰值,从最大峰值作为新三角形的顶点作到水平轴的45°连线,在这个构成的三角形作到直方图的距离d,d即为阈值T。在OpenCV中,其枚举为Imgproc.THRESH_TRIANGLE。
其几何描述如下:
Java代码(JavaFX Controller层)
public class Controller{ @FXML private Text fxText; @FXML private ImageView imageView; @FXML private Label resultLabel; @FXML public void handleButtonEvent(ActionEvent actionEvent) throws IOException { Node source = (Node) actionEvent.getSource(); Window theStage = source.getScene().getWindow(); FileChooser fileChooser = new FileChooser(); FileChooser.ExtensionFilter extFilter = new FileChooser.ExtensionFilter("PNG files (*.png)", "*.png"); fileChooser.getExtensionFilters().add(extFilter); fileChooser.getExtensionFilters().add(new FileChooser.ExtensionFilter("JPG Files(*.jpg)", "*.jpg")); File file = fileChooser.showOpenDialog(theStage); runInSubThread(file.getPath()); } private void runInSubThread(String filePath){ new Thread(new Runnable() { @Override public void run() { try { WritableImage writableImage = thresholdOfTriangle(filePath); Platform.runLater(new Runnable() { @Override public void run() { imageView.setImage(writableImage); } }); } catch (IOException e) { e.printStackTrace(); } } }).start(); } private WritableImage thresholdOfTriangle(String filePath) throws IOException { System.loadLibrary(Core.NATIVE_LIBRARY_NAME); Mat src = Imgcodecs.imread(filePath); Mat dst = new Mat(); // Construct an empty mat instance to change src into gray image. Mat gray = new Mat(); Imgproc.cvtColor(src, gray, Imgproc.COLOR_BGR2GRAY); Imgproc.threshold(gray, dst, 0, 255, Imgproc.THRESH_BINARY | Imgproc.THRESH_TRIANGLE); MatOfByte matOfByte = new MatOfByte(); Imgcodecs.imencode(".jpg", dst, matOfByte); byte[] bytes = matOfByte.toArray(); InputStream in = new ByteArrayInputStream(bytes); BufferedImage bufImage = ImageIO.read(in); WritableImage writableImage = SwingFXUtils.toFXImage(bufImage, null); return writableImage; } }
运行图
欢迎分享,转载请注明来源:内存溢出
评论列表(0条)