我花了最后两个小时在上面并且没有意识到问题出在哪里,你会帮帮我吗?
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
}
没有错误消息,代码正在编译和运行,但是输出结果不好,这不是我的预期..
答案 0 :(得分:1)
您正在独立计算每个通道的渐变;你真的需要,因为你的输出没有颜色? 同样,给定0..255通道值输入的运算符输出将为-1020..1020,因此您需要在使用Sqrt获得幅度之前或之后对其进行缩放,以使其恢复到0..255范围
但主要问题可能是“最终计算”输出会覆盖你正在循环的数组(即过滤器正在重新处理已经处理过的值),所以把它放在自己的数组中。这就是冷却抖动的效果!