带处理的边缘检测算法 (Java)
Edge Detection Algorithm with Processing (Java)
我想编写一个算法,可以对图像进行边缘检测。
我已经有了一部分代码,它以水平方式检测所有边缘。
示例图片:
但我需要水平、垂直和对角线方式的边缘检测。
如果我像水平方式一样尝试它,我会得到一个 ArrayOutOfBoundaryException(例如,如果我这样做 pixRechts= color(meinBild1.pixels[index1(x+1,y)]); )
你知道怎么做吗?
我正在使用处理。
谢谢。
到目前为止我的代码。
PImage meinBild1, meinBild2;
int anzahlPixel1, anzahlPixel2;
void setup()
{
size(1000,250);
meinBild1 = loadImage("stonehenge.jpg"); //500x250
meinBild2 = createImage(500,250, RGB);
anzahlPixel1 = meinBild1.width * meinBild1.height;
anzahlPixel2 = meinBild2.width * meinBild2.height;
meinBild1.loadPixels();
meinBild2.loadPixels();
edgeDetection();
meinBild1.updatePixels();
image(meinBild1, 0, 0);
meinBild2.updatePixels();
image(meinBild2, 500, 0);
}
void draw()
{
}
void edgeDetection()
{
int x,y;
float edge;
color pix, pixLinks;
for ( x = 1; x < meinBild2.width; x++)
{
for ( y = 0; y < meinBild2.height; y++)
{
pix= color(meinBild1.pixels[index1(x,y)]);
pixLinks= color(meinBild1.pixels[index1(x-1,y)]);
edge = abs(brightness(pix)-brightness(pixLinks));
if (edge>50) {
edge=255;
}
else{
edge=0;
}
meinBild2.pixels[index2(x,y)] = color(edge);
}
}
}
int index1(int x, int y)
{
int r= x + y*meinBild1.width;
return r;
}
int index2(int x, int y)
{
int r= x + y*meinBild2.width;
return r;
}
(e.g. if i do pixRechts= color(meinBild1.pixels[index1(x+1,y)]); )
这条线只会找到已经检测到的边缘。
我建议您按照示例中提到的那样进行操作,但您应该只检测:
- x -1, y -1 垂直
- x -1, y +1 垂直
- 水平方向的 x, y -1
你还应该看看你的两个循环。上述情况也将 运行 与您的代码一起出现 ArrayOutOfBoundsException。
- 将在第一个像素处停止
- 将在最后 y 个像素处停止
我想编写一个算法,可以对图像进行边缘检测。
我已经有了一部分代码,它以水平方式检测所有边缘。
示例图片:
但我需要水平、垂直和对角线方式的边缘检测。 如果我像水平方式一样尝试它,我会得到一个 ArrayOutOfBoundaryException(例如,如果我这样做 pixRechts= color(meinBild1.pixels[index1(x+1,y)]); )
你知道怎么做吗? 我正在使用处理。
谢谢。
到目前为止我的代码。
PImage meinBild1, meinBild2;
int anzahlPixel1, anzahlPixel2;
void setup()
{
size(1000,250);
meinBild1 = loadImage("stonehenge.jpg"); //500x250
meinBild2 = createImage(500,250, RGB);
anzahlPixel1 = meinBild1.width * meinBild1.height;
anzahlPixel2 = meinBild2.width * meinBild2.height;
meinBild1.loadPixels();
meinBild2.loadPixels();
edgeDetection();
meinBild1.updatePixels();
image(meinBild1, 0, 0);
meinBild2.updatePixels();
image(meinBild2, 500, 0);
}
void draw()
{
}
void edgeDetection()
{
int x,y;
float edge;
color pix, pixLinks;
for ( x = 1; x < meinBild2.width; x++)
{
for ( y = 0; y < meinBild2.height; y++)
{
pix= color(meinBild1.pixels[index1(x,y)]);
pixLinks= color(meinBild1.pixels[index1(x-1,y)]);
edge = abs(brightness(pix)-brightness(pixLinks));
if (edge>50) {
edge=255;
}
else{
edge=0;
}
meinBild2.pixels[index2(x,y)] = color(edge);
}
}
}
int index1(int x, int y)
{
int r= x + y*meinBild1.width;
return r;
}
int index2(int x, int y)
{
int r= x + y*meinBild2.width;
return r;
}
(e.g. if i do pixRechts= color(meinBild1.pixels[index1(x+1,y)]); )
这条线只会找到已经检测到的边缘。
我建议您按照示例中提到的那样进行操作,但您应该只检测:
- x -1, y -1 垂直
- x -1, y +1 垂直
- 水平方向的 x, y -1
你还应该看看你的两个循环。上述情况也将 运行 与您的代码一起出现 ArrayOutOfBoundsException。
- 将在第一个像素处停止
- 将在最后 y 个像素处停止