Java 我的Sobel边缘检测算子输出很奇怪
我的Sobel边缘检测算子的输出很奇怪。 这是我的密码:Java 我的Sobel边缘检测算子输出很奇怪,java,image-processing,edge-detection,sobel,Java,Image Processing,Edge Detection,Sobel,我的Sobel边缘检测算子的输出很奇怪。 这是我的密码: BufferedImage temp = img; float kernelx[][] = {{-1, 0, 1},{-2, 0, 2},{-1, 0, 1}}; float kernely[][] = {{-1, -2, -1},{0, 0, 0},{1, 2, 1}}; float valx = 0; float valy = 0; float val = 0;
BufferedImage temp = img;
float kernelx[][] = {{-1, 0, 1},{-2, 0, 2},{-1, 0, 1}};
float kernely[][] = {{-1, -2, -1},{0, 0, 0},{1, 2, 1}};
float valx = 0;
float valy = 0;
float val = 0;
for(int i=1;i<width-2;i++) {
for(int j=1;j<height-2;j++) {
valx = (kernelx[0][0]*new Color(img.getRGB(i-1, j-1)).getRed()) + (kernelx[0][2]*new Color(img.getRGB(i+1, j-1)).getRed()) +
(kernelx[1][0]*new Color(img.getRGB(i-1, j)).getRed()) + (kernelx[1][2]*new Color(img.getRGB(i+1, j)).getRed()) +
(kernelx[2][0]*new Color(img.getRGB(i-1, j+1)).getRed()) + (kernelx[2][2]*new Color(img.getRGB(i+1, j+1)).getRed());
valy = (kernely[0][0]*new Color(img.getRGB(i-1, j-1)).getRed()) + (kernely[0][1]*new Color(img.getRGB(i, j-1)).getRed()) + (kernely[0][2]*new Color(img.getRGB(i+1, j-1)).getRed()) +
(kernely[2][0]*new Color(img.getRGB(i-1, j+1)).getRed()) + (kernely[2][1]*new Color(img.getRGB(i, j+1)).getRed()) + (kernely[2][2]*new Color(img.getRGB(i+1, j+1)).getRed());
val = (float)sqrt(valx*valx+valy*valy);
val = val/1443*255;
if(val <= 127) {
val = 0;
} else {
val = 255;
}
temp.setRGB(i, j, new Color((int)val,(int)val,(int)val).getRGB());
}
File outputfile = new File("src/image/edge.png");
ImageIO.write(temp, "png", outputfile);
}
BufferedImage temp=img;
浮点内核x[][]={{-1,0,1},{-2,0,2},{-1,0,1};
浮点核[][]={{-1,-2,-1},{0,0,0},{1,2,1};
float valx=0;
浮谷=0;
float val=0;
对于(int i=1;i,代码中存在不同的问题:
- 当使用维度为3x3的内核时,从[1,1]到[width-1,height-1],而不是[width-2,height-2]
- 在java中,使用image.getRaster().getSample(x,y,channel),而不是“new Color(img.getRGB(i-1,j-1)).getRed()”。这将更快更容易理解。编写
image.getRaster().setSample(x,y,channel,value)
- 在[0,max]上编码的图像上计算Sobel梯度时,每个方向(X和Y)都会给出[-4*max,4*max]上的值。因此,切割超出的值是很有攻击性的。您可能希望执行直方图拉伸,然后保留更多信息
- 规范化
val=val/1443*255;
由您决定,但不是必需的
- 最后,将主要问题写入代码。生成的图像(在您的情况下是temp)和原始图像必须不同。否则,您在处理图像的同时修改图像。这解释了为什么您的图像有这么大的白色区域
啊,我明白了,谢谢你的回答,让我尝试修复代码,我会告诉你结果。是的,最后一点是主要问题,也是第一点。不要忘记第三点,以获得更好(更精确)的结果。第二点是一个好习惯:-)