为了账号安全,请及时绑定邮箱和手机立即绑定

拉普拉斯滤波器产生奇怪的结果(Java)

拉普拉斯滤波器产生奇怪的结果(Java)

喵喔喔 2021-10-28 17:01:35
我正在尝试应用[-1][-1][-1][-1][8][-1][-1][-1][-1]3*3 拉普拉斯滤波器到著名照片(png 扩展名)的灰度版本。我主要使用BufferedImage该类来处理图像。这是拉普拉斯滤波器方法。private BufferedImage measureContrast(BufferedImage image) {        BufferedImage grayScale = createGrayscaleImage(image);        BufferedImage copy = copyImage(grayScale);        int width = image.getWidth();        int height = image.getHeight();        int sum=0;        int a;         //3*3 Laplacian filter (-1,-1,-1), (-1,8,-1), (-1,-1,-1)        for(int y=1;y<height-1;y++)            for(int x=1;x<width-1;x++) {                sum = (-1*(grayScale.getRGB(x-1, y-1)&0xff)) + (-1*(grayScale.getRGB(x, y-1)&0xff)) + (-1*(grayScale.getRGB(x+1, y-1)&0xff))                        + (-1*(grayScale.getRGB(x-1, y)&0xff)) + (8*(grayScale.getRGB(x,y)&0xff)) + (-1*(grayScale.getRGB(x+1, y)&0xff)) +                        (-1*(grayScale.getRGB(x-1, y+1)&0xff)) + (-1*(grayScale.getRGB(x, y+1)&0xff)) + (-1*(grayScale.getRGB(x+1, y+1)&0xff));                             a = ((grayScale.getRGB(x, y)>>24)&0xff);                copy.setRGB(x, y, ((a<<24)|(sum<<16)|(sum<<8)|(sum)));            }return copy;如果我运行该代码,结果是这样的这显然是错误的。图像中突然出现奇怪的粗线。我可以确保灰度版本是正确的,因为当我在应用过滤器之前运行以下代码时,输出会提供完美的灰度图像。private BufferedImage measureContrast(BufferedImage image) {        BufferedImage grayScale = createGrayscaleImage(image);        BufferedImage copy = copyImage(grayScale); /*rest of the code is commented*/return copy;我一直试图找到这个问题几个小时,但我认为代码没有任何问题......任何见解将不胜感激。提前致谢!
查看完整描述

1 回答

?
慕森卡

TA贡献1806条经验 获得超8个赞

private BufferedImage measureContrast(BufferedImage image) {

        BufferedImage grayScale = createGrayscaleImage(image);

        BufferedImage copy = copyImage(grayScale);


        int width = image.getWidth();

        int height = image.getHeight();

        int sum=0;

        int a;

         //3*3 Laplacian filter (-1,-1,-1), (-1,8,-1), (-1,-1,-1)

        for(int y=1;y<height-1;y++)

            for(int x=1;x<width-1;x++) {

                sum = (-1*(grayScale.getRGB(x-1, y-1)&0xff)) + (-1*(grayScale.getRGB(x, y-1)&0xff)) + (-1*(grayScale.getRGB(x+1, y-1)&0xff))

                        + (-1*(grayScale.getRGB(x-1, y)&0xff)) + (8*(grayScale.getRGB(x,y)&0xff)) + (-1*(grayScale.getRGB(x+1, y)&0xff)) +

                        (-1*(grayScale.getRGB(x-1, y+1)&0xff)) + (-1*(grayScale.getRGB(x, y+1)&0xff)) + (-1*(grayScale.getRGB(x+1, y+1)&0xff));             

                a = ((grayScale.getRGB(x, y)>>24)&0xff);

                copy.setRGB(x, y, ((a<<24)|(sum<<16)|(sum<<8)|(sum)));

            }

return copy;

这个方法是错误的。我应该考虑 sum 何时为负值。所以我sum = (sum>0)?sum:0;在嵌套的 for 循环中添加,以确保在这些情况下像素值为 0。


查看完整回答
反对 回复 2021-10-28
  • 1 回答
  • 0 关注
  • 127 浏览

添加回答

举报

0/150
提交
取消
意见反馈 帮助中心 APP下载
官方微信