提问人:510NH 提问时间:6/8/2018 最后编辑:510NH 更新时间:6/8/2018 访问量:594
由于某种原因,我的拉普拉斯过滤器程序无法正常工作
For some reason, my Laplacian filter program is not working
问:
所以你在这里看到的所有方法都是我的导师给出的。它们工作得很好,他们已经使用它们多年了。我知道我的代码可能看起来太长或效率低下。我故意这样做是因为我想放大一切,一旦我让这个东西工作,我就会缩短它并创建一个计算加权和的方法。
为了测试此代码是否对正确的颜色进行了更改,我将 redSum 分配给 255,将其他所有内容分配给 0,生成的图像是纯红色的。对绿色和蓝色也做了同样的事情。
我无法弄清楚我在这里错过了什么。还给出了拉普拉斯 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);
}
}
答:
1赞
StaticBeagle
6/8/2018
#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[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);
评论
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永远没有完成
评论
0.33*r + 0.56*b + 0.11*b