索贝尔运营商不工作

时间:2012-03-09 05:42:42

标签: java arrays image-processing matrix computer-vision

我花了最后两个小时在上面并且没有意识到问题出在哪里,你会帮帮我吗?

public static void sobel(Img img) {

    int[][][] myArray = img.getmyArray();
    int[][][] sobelX = img.copyMyArray();
    int[][][] sobelY = img.copyMyArray();

    //itearates through the matrix to apply the Sobel Operator
    for (int line = 1; line < myArray.length -2; line++)
        for (int column = 1; column < myArray[line].length -2; column++)
            for(int color = 0; color < 3; color++){

            sobelX[line][column][color] =
                    -1 * myArray[line-1][column-1][color] +
                    -2 * myArray[line-1][column][color] +
                    -1 * myArray[line-1][column+1][color] +

                     0 * myArray[line][column-1][color] +
                     0 * myArray[line][column][color] +
                     0 * myArray[line][column+1][color] +

                     1 * myArray[line+1][column-1][color] +
                     2 * myArray[line+1][column][color] +
                     1 * myArray[line+1][column+1][color];

            sobelY[line][column][color] =
                    -1 * myArray[line-1][column-1][color] +
                     0 * myArray[line-1][column][color] +
                     1 * myArray[line-1][column+1][color] +

                    -2 * myArray[line][column-1][color] +
                     0 * myArray[line][column][color] +
                     2 * myArray[line][column+1][color] +

                    -1 * myArray[line+1][column-1][color] +
                     0 * myArray[line+1][column][color] +
                     1 * myArray[line+1][column+1][color];


            //Final Calculation
            myArray[line][column][color] = check_0_255_limit((int)Math.sqrt(
                    sobelX[line][column][color] * sobelX[line][column][color]
                    +
                    sobelY[line][column][color] * sobelY[line][column][color]
                    ));

        }// end for loop
}

没有错误消息,代码正在编译和运行,但是输出结果不好,这不是我的预期.. Sobel Operator

1 个答案:

答案 0 :(得分:1)

您正在独立计算每个通道的渐变;你真的需要,因为你的输出没有颜色? 同样,给定0..255通道值输入的运算符输出将为-1020..1020,因此您需要在使用Sqrt获得幅度之前或之后对其进行缩放,以使其恢复到0..255范围

但主要问题可能是“最终计算”输出会覆盖你正在循环的数组(即过滤器正在重新处理已经处理过的值),所以把它放在自己的数组中。这就是冷却抖动的效果!