计算二值化图像中的对象,坐标超出范围

时间:2013-12-11 03:44:28

标签: java image swing image-processing

我最终会遇到这个问题。

请注意我是一个非常新手的编码员(虽然我确信你会看到我的代码)。

基础知识:

我有一个图像,我想计算对象的数量。在这个例子中的对象只是连接像素(图像已被阈值化,并经历了二值化和二进制侵蚀,以达到这个阶段,代码不包括在内)。

我的问题:

我正在尝试编写一些代码来计算此图像中剩余的对象数量,并且在该方法中我调用另一种方法,该方法旨在通过搜索相邻像素来删除已包含的任何对象附上。但是,我当前对此删除方法的实现引发了一个错误:“坐标越界”。我要求任何帮助解决这个问题。

整体对象计数代码:

      /**
   * 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方法中,我试图使用递归技术从标记它们或相邻像素的图像中删除像素坐标。

如果其中任何一个不清楚(我知道我的代码可能有多个令人困惑的部分,请询问,我会进一步解释)。

感谢您的帮助。

1 个答案:

答案 0 :(得分:1)

我没有足够的声誉发表评论,因此将我的评论写成答案。 你确定你的x和y坐标搞砸了吗?我前段时间遇到了类似的问题,但我已经弄乱了图像的高度和宽度。