【发布时间】:2016-02-10 15:17:15
【问题描述】:
我正在尝试使用 sobel 过滤器对 BufferedImage 进行边缘检测。但似乎 Java 过滤器系统无法正确处理图像中的负值(而手动实现只会abs() 它们)。是否可以在不手动编写整个过滤器的情况下避免此问题?
代码:
BufferedImage image, converted_image;
try {
image = ImageIO.read(new File("image.png"));
// convert image from ARGB to RGB
BufferedImage newImage = new BufferedImage(image.getWidth(), image.getHeight(), BufferedImage.TYPE_INT_RGB);
Graphics2D g = newImage.createGraphics();
g.drawImage(image, 0, 0, image.getWidth(), image.getHeight(), null);
g.dispose();
image = newImage;
} catch (IOException ex) {
System.exit(1);
}
float sobel[] = {
1.0f, 0.0f, -1.0f,
2.0f, 0.0f, -2.0f,
1.0f, 0.0f, -1.0f
};
BufferedImageOp sobelFilter = new ConvolveOp(new Kernel(3, 3, sobel));
converted_image = sobelFilter.filter(image, null);
try {
ImageIO.write(converted_image, "png", new File("image2.png"));
} catch (IOException ex) {
System.exit(1);
}
示例图片:
以及错误的边缘检测。请注意,虽然过滤器应该只处理垂直边缘,但它只处理 black | white 边缘而不是 white | black 边缘。
【问题讨论】:
标签: java image image-processing edge-detection