我最终会遇到这个问题。
请注意我是一个非常新手的编码员(虽然我确信你会看到我的代码)。
基础知识:
我有一个图像,我想计算对象的数量。在这个例子中的对象只是连接像素(图像已被阈值化,并经历了二值化和二进制侵蚀,以达到这个阶段,代码不包括在内)。
我的问题:
我正在尝试编写一些代码来计算此图像中剩余的对象数量,并且在该方法中我调用另一种方法,该方法旨在通过搜索相邻像素来删除已包含的任何对象附上。但是,我当前对此删除方法的实现引发了一个错误:“坐标越界”。我要求任何帮助解决这个问题。
整体对象计数代码:
/**
* countObjects in image
*
* @param binary image to count objects in
* @param original image to put labels on
*
* @return labelled original image for graphics overlay
*/
public static BufferedImage countObjects(BufferedImage image, BufferedImage original){
BufferedImage target = copyImage(image);
int rgbBand = 0;
boolean finished = false;
Graphics labelColour = original.getGraphics();
labelColour.setColor(Color.RED);
while(!finished){
finished = false;
for ( int i=0; i<= target.getRaster().getWidth() - 1; i++ ) {
for( int j=0; j< target.getRaster().getHeight() - 1; j++ ) {
int clrz = target.getRaster().getSample(i, j, rgbBand);
if (clrz == 1) {
System.out.println(clrz);
removeObject(i, j, target);
labelColour.drawString( ""+count, i, j);
finished=true;
}
}
}
}
return original;
删除对象的代码:
/**
*
* @param x
* @param y
* @param newImage
*
*/
private static void removeObject( int x, int y, BufferedImage newImage ){
int rgbBand = 0;
int[] zero = new int[] { 0 };
newImage.getRaster().setPixel(x, y, zero);
for (int a = Math.max(0, x - 1); a <= Math.min(x + 1, newImage.getRaster().getWidth()); a++) {
for (int b = Math.max(0, y - 1); b <= Math.min(y + 1, newImage.getRaster().getHeight()); b++) {
int na = a;
int nb = b;
if (newImage.getRaster().getSample(na, nb, rgbBand) == 1) {
removeObject( nc, nd, newImage );
}
}
}
}
在上面的removeObject方法中,我试图使用递归技术从标记它们或相邻像素的图像中删除像素坐标。
如果其中任何一个不清楚(我知道我的代码可能有多个令人困惑的部分,请询问,我会进一步解释)。
感谢您的帮助。
答案 0 :(得分:1)
我没有足够的声誉发表评论,因此将我的评论写成答案。 你确定你的x和y坐标搞砸了吗?我前段时间遇到了类似的问题,但我已经弄乱了图像的高度和宽度。