Java 索贝尔算子不';不能处理矩形图像
我尝试在Java中实现Sobel操作符,但结果只是一些像素的混合Java 索贝尔算子不';不能处理矩形图像,java,sobel,Java,Sobel,我尝试在Java中实现Sobel操作符,但结果只是一些像素的混合 int i, j; FileInputStream inFile = new FileInputStream(args[0]); BufferedImage inImg = ImageIO.read(inFile); int width = inImg.getWidth(); int height = inImg.getHeight(); int[] output = new int
int i, j;
FileInputStream inFile = new FileInputStream(args[0]);
BufferedImage inImg = ImageIO.read(inFile);
int width = inImg.getWidth();
int height = inImg.getHeight();
int[] output = new int[width * height];
int[] pixels = inImg.getRaster().getPixels(0, 0, width, height, (int[])null);
double Gx;
double Gy;
double G;
for(i = 0 ; i < width ; i++ )
{
for(j = 0 ; j < height ; j++ )
{
if (i==0 || i==width-1 || j==0 || j==height-1)
G = 0;
else{
Gx = pixels[(i+1)*height + j-1] + 2*pixels[(i+1)*height +j] + pixels[(i+1)*height +j+1] -
pixels[(i-1)*height +j-1] - 2*pixels[(i-1)*height+j] - pixels[(i-1)*height+j+1];
Gy = pixels[(i-1)*height+j+1] + 2*pixels[i*height +j+1] + pixels[(i+1)*height+j+1] -
pixels[(i-1)*height+j-1] - 2*pixels[i*height+j-1] - pixels[(i+1)*height+j-1];
G = Math.hypot(Gx, Gy);
}
output[i*height+j] = (int)G;
}
}
BufferedImage outImg = new BufferedImage(width,height,BufferedImage.TYPE_BYTE_GRAY);
outImg.getRaster().setPixels(0,0,width,height,output);
FileOutputStream outFile = new FileOutputStream("result.jpg");
ImageIO.write(outImg,"JPG",outFile);
JFrame TheFrame = new JFrame("Result");
JLabel TheLabel = new JLabel(new ImageIcon(outImg));
TheFrame.getContentPane().add(TheLabel);
TheFrame.setSize(width, height);
TheFrame.addWindowListener(new WindowAdapter() {
public void windowClosing(WindowEvent e) {
System.exit(0);
}
});
TheFrame.setVisible(true);
inti,j;
FileInputStream infle=新的FileInputStream(args[0]);
BuffereImage inImg=图像IO.read(填充);
int-width=inImg.getWidth();
int height=inImg.getHeight();
int[]输出=新int[宽度*高度];
int[]pixels=inImg.getRaster().getPixels(0,0,宽度,高度,(int[])null);
双Gx;
双Gy;
双G;
对于(i=0;i
它适用于方形图像,但宽度!=高度结果图像被打断,并且有一些黑色斜线:\
例如:
结果:
您的代码似乎期望
光栅.getPixels
在列中生成结果,如下所示:
0 3 6
1 4 7
2 5 8
0 1 2
3 4 5
6 7 8
但我相信它实际上是成排的,就像这样:
0 3 6
1 4 7
2 5 8
0 1 2
3 4 5
6 7 8
所以基本上,你现在有这样的东西:
pxy = pixels[x * height + y];
你应该
pxy = pixels[y * width + x];
例如,你有:
pixels[(i+1)*height + j-1]
你想要
pixels[(j-1)*width + i-1]
您的代码似乎期望
graster.getPixels
在列中生成结果,如下所示:
0 3 6
1 4 7
2 5 8
0 1 2
3 4 5
6 7 8
但我相信它实际上是成排的,就像这样:
0 3 6
1 4 7
2 5 8
0 1 2
3 4 5
6 7 8
所以基本上,你现在有这样的东西:
pxy = pixels[x * height + y];
你应该
pxy = pixels[y * width + x];
例如,你有:
pixels[(i+1)*height + j-1]
你想要
pixels[(j-1)*width + i-1]
您的代码似乎期望
graster.getPixels
在列中生成结果,如下所示:
0 3 6
1 4 7
2 5 8
0 1 2
3 4 5
6 7 8
但我相信它实际上是成排的,就像这样:
0 3 6
1 4 7
2 5 8
0 1 2
3 4 5
6 7 8
所以基本上,你现在有这样的东西:
pxy = pixels[x * height + y];
你应该
pxy = pixels[y * width + x];
例如,你有:
pixels[(i+1)*height + j-1]
你想要
pixels[(j-1)*width + i-1]
您的代码似乎期望
graster.getPixels
在列中生成结果,如下所示:
0 3 6
1 4 7
2 5 8
0 1 2
3 4 5
6 7 8
但我相信它实际上是成排的,就像这样:
0 3 6
1 4 7
2 5 8
0 1 2
3 4 5
6 7 8
所以基本上,你现在有这样的东西:
pxy = pixels[x * height + y];
你应该
pxy = pixels[y * width + x];
例如,你有:
pixels[(i+1)*height + j-1]
你想要
pixels[(j-1)*width + i-1]
我做了这些改变,但仍然是错的。结果不一样,但也有点像噪音。@micobg:我怀疑你当时的改变并不一致。如果你错过了一次计算,你就会有问题。它还适用于方形图片吗?我适用于!:)非常感谢你!我用于测试的图片不是灰度的。白色的灰度图像效果很好。我做了一些改变,但仍然是错误的。结果不一样,但也有点像噪音。@micobg:我怀疑你当时的改变并不一致。如果你错过了一次计算,你就会有问题。它还适用于方形图片吗?我适用于!:)非常感谢你!我用于测试的图片不是灰度的。白色的灰度图像效果很好。我做了一些改变,但仍然是错误的。结果不一样,但也有点像噪音。@micobg:我怀疑你当时的改变并不一致。如果你错过了一次计算,你就会有问题。它还适用于方形图片吗?我适用于!:)非常感谢你!我用于测试的图片不是灰度的。白色的灰度图像效果很好。我做了一些改变,但仍然是错误的。结果不一样,但也有点像噪音。@micobg:我怀疑你当时的改变并不一致。如果你错过了一次计算,你就会有问题。它还适用于方形图片吗?我适用于!:)非常感谢你!我用于测试的图片不是灰度的。带灰度图像,效果很好。