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

For some reason, my Laplacian filter program is not working

提问人:510NH 提问时间:6/8/2018 最后编辑:510NH 更新时间:6/8/2018 访问量:594

问:

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

为了测试此代码是否对正确的颜色进行了更改,我将 redSum 分配给 255,将其他所有内容分配给 0,生成的图像是纯红色的。对绿色和蓝色也做了同样的事情。

我无法弄清楚我在这里错过了什么。还给出了拉普拉斯 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);
  }
}
爪哇岛

评论

0赞 Gus 6/8/2018
我看到结果图像只有黑/白/灰——您是否尝试过转换为灰度(其中 R=G=B)?从这张图片的外观来看,你可能可以对 R+B+G 求和,任何超过 255 的结果都应该设置为 0——这样你的转换只会使“微妙”的细节可见。
0赞 Andy Turner 6/8/2018
@Gus转换为灰度的标准方法是加权,例如 或类似的东西。我已经从遥远的记忆中拖出了这些重量。0.33*r + 0.56*b + 0.11*b

答:

1赞 StaticBeagle 6/8/2018 #1

temp并指向相同的内存位置,因此在每次迭代中都会被覆盖。datadata

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 - 1temp[0][0]nullpi.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);

评论

0赞 510NH 6/8/2018
谢谢!我什至忘了考虑这一点。但是随着新的修改,该程序需要很长时间才能应用过滤器。关于为什么会发生这种情况的任何想法?
0赞 Andy Turner 6/8/2018
@510NH“为什么会这样”,因为.Pixel[][] temp = data;
0赞 StaticBeagle 6/8/2018
@510NH,它是否产生了正确的输出,只是需要很长时间?还是只是永远没有完成?
0赞 510NH 6/8/2018
@AndyTurner我删除了该部分,并将其替换为 StaticBeagle 提供的行。已经过去了 5 分钟,新图像尚未计算。
0赞 510NH 6/8/2018
@StaticBeagle永远没有完成