阈值化
阈值化操作,从一副图像中利用阈值分割出需要的物体部分。这样的图像分割方法是基于图像中物体与背景之间的灰度差异,而且此分割属于像素级的分割。
进行阈值化使用的方法为threshold(Mat src, Mat dst, double thresh, double maxval, int type) 。该方法参数意义如下:
- mat
表示输入图像的Mat对象。 - dst
表示输出图像的Mat对象。 - thresh
阈值,即临界点值。 - maxval
一个整数,表示与THRESH_BINARY和THRESH_BINARY_INV阈值类型一起使用的最大值。 - type
表示转换类型的整数代码,例如RGB到灰度。
Java代码(JavaFX Controller层)
public class Controller{
@FXML private Text fxText;
@FXML private ImageView imageView;
@FXML public void handleButtonEvent(ActionEvent actionEvent) {
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);
imageView.setImage(this.colorSRCToBinary(file.getPath()));
}
private WritableImage colorSRCToBinary(String filePath){
System.loadLibrary(Core.NATIVE_LIBRARY_NAME);
Imgcodecs imageCodecs = new Imgcodecs();
String input = filePath;
Mat src = imageCodecs.imread(input, Imgcodecs.IMREAD_COLOR);
Mat dst = new Mat();
Imgproc.threshold(src, dst, 200, 600, Imgproc.THRESH_BINARY);
byte[] data = new byte[src.rows() * src.cols() * (int) (src.elemSize())];
dst.get(0, 0, data);
BufferedImage bufImage = new BufferedImage(dst.cols(), dst.rows(), BufferedImage.TYPE_BYTE_GRAY);
bufImage.getRaster().setDataElements(0, 0, dst.cols(), dst.rows(), data);
WritableImage writableImage = SwingFXUtils.toFXImage(bufImage, null);
return writableImage;
}
}
运行图
图1 - 二进制转换图
图2 - Lenna原图