使用sobel算子进行边缘检测

时间:2016-11-24 08:24:59

标签: java image sobel

所以我正在尝试编写一个使用sobel算子来检测图像边缘的程序。以下是我的方法。

/**
 * Detects edges.
 * @param url - filepath to the iamge.
 */
private void detect(String url) {
    BufferedImage orgImage = readImage(url);
    int width = orgImage.getWidth();
    int height = orgImage.getHeight();
    BufferedImage resImage = new BufferedImage(width, height, BufferedImage.TYPE_BYTE_BINARY);
    WritableRaster inraster = orgImage.getRaster();
    WritableRaster outraster = resImage.getRaster();


    System.out.println("size: " + width + "X" + height);
    // Loop through every pixel, ignores the edges as these will throw out of
    //bounds.
    for (int i = 1; i < width-2; i++) {
        for (int j = 1; j < height-2; j++) {

            // Compute filter result, loops over in a
            // box pattern.
            int sum = 0;
            for (int x = -1; x <= 1; x++) {
                for (int y = -1; y <= 1; y++) {

                    int sum1 = i+y;
                    int sum2 = j+x;

                    int p = inraster.getSample(sum1, sum2, 0);
                    sum = sum + p;
                }
            }
            int q = (int) Math.round(sum / 9.0);

            if(q<150){
                q = 0;
            }else{
                q = 255;
            }
            outraster.setSample(i, j, 0, q);
        }
    }
    writeImage(resImage, "jpg", "EdgeDetection " + url);
}

这主要是给我一张黑白图像:

Before

After

我无意中以某种方式错误地计算了像素值。我还要注意在确定像素应该是黑色还是白色时要确定使用什么值。

0 个答案:

没有答案