使用Java的ConvolveOP进行sobel滤波器的图像边缘检测问题

时间:2015-11-18 19:23:01

标签: java image image-processing edge-detection

我正在尝试使用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);
    }

示例图片:

enter image description here

错误的边缘检测。请注意,虽然过滤器只应处理垂直边,但它只处理black | white个边,而不是white | black个边。

enter image description here

1 个答案:

答案 0 :(得分:0)

这是一个显示问题 - 该方法使用从左到右“进入”的颜色 - 所以黑色覆盖了所有内容 - 在此使用彩色图像 Useful image

我明白了

output