所以你在这里看到的所有方法都是由我的导师给出的。他们工作得很好,他们多年来一直在使用它们。我知道我的代码可能看起来太长或效率低。我故意这样做,因为我想要放大所有东西,一旦我把这个东西付诸实践,我会缩短它并创建一个计算加权和的方法。
为了测试此代码是否更改了正确的颜色,我将redSum指定为255,将其他所有指定为0,并且生成的图像为纯红色。绿色和蓝色也一样。
我无法弄清楚我在这里缺少什么。还给出了laplacian int数组中的权重。
public class LaplacianFilter implements Filter
{
public void filter(PixelImage pi) {
Pixel[][] data = pi.getData();
int laplacian [][] = {{-1,-1, -1}, {-1, 8, -1}, {-1, -1, -1}};
Pixel[][] temp = data;
for(int row = 1; row < pi.getHeight() - 1; row++)
{
for(int col = 1; col < pi.getWidth() - 1; col++)
{
int redSum = laplacian[0][0]*data[row-1][col-1].red + laplacian[0][1]*data[row-1][col+0].red + laplacian[0][2]*data[row-1][col+1].red +
laplacian[1][0]*data[row+0][col-1].red + laplacian[1][1]*data[row+0][col+0].red + laplacian[1][2]*data[row+0][col+1].red +
laplacian[2][0]*data[row+1][col-1].red + laplacian[2][1]*data[row+1][col+0].red + laplacian[2][2]*data[row+1][col+1].red;
int greenSum = laplacian[0][0]*data[row-1][col-1].green + laplacian[0][1]*data[row-1][col+0].green + laplacian[0][2]*data[row-1][col+1].green +
laplacian[1][0]*data[row+0][col-1].green + laplacian[1][1]*data[row+0][col+0].green + laplacian[1][2]*data[row+0][col+1].green +
laplacian[2][0]*data[row+1][col-1].green + laplacian[2][1]*data[row+1][col+0].green + laplacian[2][2]*data[row+1][col+1].green;
int blueSum = laplacian[0][0]*data[row-1][col-1].blue + laplacian[0][1]*data[row-1][col+0].blue + laplacian[0][2]*data[row-1][col+1].blue +
laplacian[1][0]*data[row+0][col-1].blue + laplacian[1][1]*data[row+0][col+0].blue + laplacian[1][2]*data[row+0][col+1].blue +
laplacian[2][0]*data[row+1][col-1].blue + laplacian[2][1]*data[row+1][col+0].blue + laplacian[2][2]*data[row+1][col+1].blue;
redSum = Math.min(255, Math.max(0, redSum));
greenSum = Math.min(255, Math.max(0, greenSum));
blueSum = Math.min(255, Math.max(0, blueSum));
temp[row][col].red = redSum;
temp[row][col].green = greenSum;
temp[row][col].blue = blueSum;
}
}
pi.setData(temp);
}
}
答案 0 :(得分:1)
temp
和data
指向相同的内存位置,因此在每次迭代中都会覆盖data
。
temp[row][col].red = redSum;
temp[row][col].green = greenSum;
temp[row][col].blue = blueSum;
对自己的数组初始化temp:
Pixel[][] temp = new Pixel[data.length][data[0].length];
因为你正在从1到width/height - 1
从temp的所有“角落”迭代,例如temp[0][0]
将为null
,因此您需要在致电pi.setData(temp);
int lastRow = temp.length - 1;
int lastCol = temp[0].length - 1;
temp[0] = data[0];
temp[lastRow] = data[lastRow];
for(int i = 1; i < lastRow; ++i) {
temp[i][0] = data[i][0];
temp[i][lastCol] = data[i][lastCol];
}
pt.setData(temp);