gpt4 book ai didi

java - Sobel 边缘检测、图像卷积

转载 作者:行者123 更新时间:2023-12-01 19:25:31 27 4
gpt4 key购买 nike

我正在使用图像上的索贝尔边缘检测进行作业。我目前正在努力进行渐变操作。编译时收到“二元运算符 '*' 的操作数类型错误”错误。我认为这可能是因为我将所有像素定义为字母,并且我不确定下一步应该是什么。任何帮助将不胜感激!预先感谢您!

public static BufferedImage sobelEdgeDetect(BufferedImage input) {
int img_width = input.getWidth();
int img_height = input.getHeight();

BufferedImage output_img = new BufferedImage(
img_width, img_height, BufferedImage.TYPE_INT_RGB);

for (int x = 0; x < img_width; x++) {
for (int y = 0; y < img_height; y++) {

Color color_at_pos = new Color(input.getRGB(x, y));

int red = color_at_pos.getRed();
int green = color_at_pos.getGreen();
int blue = color_at_pos.getBlue();

int average = (red + green + blue) / 3;

Color A,B,C,D,F,G,H,I;

if(x-1 > 0 && y+1 < img_height){
A = new Color (input.getRGB(x-1,y+1));
} else {
A = Color.BLACK;
}

if(y+1 < img_height){
B = new Color (input.getRGB(x,y+1));
} else {
B = Color.BLACK;
}

if(x+1 < img_width && y+1 < img_height){
C = new Color (input.getRGB(x+1,y+1));
} else {
C = Color.BLACK;
}

if(x-1 > 0){
D = new Color (input.getRGB(x-1,y));
} else {
D = Color.BLACK;
}

if(x+1 < img_width){
F = new Color (input.getRGB(x+1,y));
} else {
F = Color.BLACK;
}

if(x-1 > 0 && y-1 > 0){
G = new Color (input.getRGB(x-1,y-1));
} else {
G = Color.BLACK;
}

if(y-1 > 0){
H = new Color (input.getRGB(x,y-1));
} else {
H = Color.BLACK;
}

if(x+1 > img_width && y-1 > 0){
I = new Color (input.getRGB(x+1,y-1));
} else {
I = Color.BLACK;
}

int gx = (-A + (-2*D) + -G + C + (2*F)+ I);
int gy = (A + (2*B) + C + (-G) + (-2*H) + (-I));

int result = (int)math.sqrt((gx*gx) + (gy*gy));

if (average < 0) {
average = 0;
} else if (average > 255) {
average = 255;
}

Color average_color = new Color(average, average, average);

output_img.setRGB(x, y, average_color.getRGB());
}
}
return output_img;
}

最佳答案

问题出在颜色的处理上,在这里:

int gx = (-A + (-2*D) + -G + C + (2*F)+ I);
int gy = (A + (2*B) + C + (-G) + (-2*H) + (-I));

这行不通。

要获得渐变,您必须这样做

  • 单独处理每种颜色
  • 处理灰度图像

我无法告诉您哪一个适合您。

单独处理每种颜色:

使用这种方法,您可以单独处理每种颜色以检测该颜色的边缘

//red:
int redGx = (-A.getRed() + (-2*D.getRed()) + -G.getRed() + C.getRed() + (2*F.getRed())+ I.getRed());
int redGy = ...

//green:
int greenGx = (-A.getGreen()...

处理为灰色

int redGx = (toGray(A) + (-2*toGray(D)) + -toGray(G) + toGray(C) + (2*toGray(F))+ toGray(I));
int redGy = ...

你必须提供方法toGray/平均颜色

static int toGray(Color col){
return (color.getGreen()+color.getRed()+col.getBlue()) / 3;
}

关于java - Sobel 边缘检测、图像卷积,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/59316442/

27 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com