1

所以我正在尝试编写一个使用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);
}

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

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

4

0 回答 0