出于某种原因,我的拉普拉斯滤波器程序无法正常工作

时间:2018-06-07 18:53:55

标签: java

所以你在这里看到的所有方法都是由我的导师给出的。他们工作得很好,他们多年来一直在使用它们。我知道我的代码可能看起来太长或效率低。我故意这样做,因为我想要放大所有东西,一旦我把这个东西付诸实践,我会缩短它并创建一个计算加权和的方法。

为了测试此代码是否更改了正确的颜色,我将redSum指定为255,将其他所有指定为0,并且生成的图像为纯红色。绿色和蓝色也一样。

我无法弄清楚我在这里缺少什么。还给出了laplacian int数组中的权重。

我们应该将过滤器应用于原始图片: the original picture we are supposed to apply the filters to

应用拉普拉斯滤波器后图片应如何显示生命 how the picture is supposed to look life after applying the Laplacian filter

我使用当前程序应用过滤器后得到的结果 the result that I got after applying the filter with my current program

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);
  }
}

1 个答案:

答案 0 :(得分:1)

tempdata指向相同的内存位置,因此在每次迭代中都会覆盖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);