Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/385.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/7/image/5.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java 计算二值化图像中的对象,坐标超出范围_Java_Image_Swing_Image Processing - Fatal编程技术网

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

Java 计算二值化图像中的对象,坐标超出范围,java,image,swing,image-processing,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二进制图像,用于在
*@param要在其上放置标签的原始图像
* 
*@return标记原始图像用于图形叠加
*/
公共静态BuffereImage countObjects(BuffereImage,BuffereImage原件){
BuffereImage目标=copyImage(图像);
int rgbBand=0;
布尔完成=假;
Graphics LabelColor=original.getGraphics();
LabelColor.setColor(颜色:红色);
当(!完成){
完成=错误;

对于(int i=0;i我没有足够的声誉发表评论,因此写下我的评论作为回答。
你确定你没有弄乱x和y坐标吗?我不久前也遇到过类似的问题,但我弄乱了图像的高度和宽度。

1)为了更快地获得更好的帮助,请发布一个帖子。2)获取图像的一种方法是热链接到中看到的图像。嗨,谢谢你的参与。我已经尝试了所有方法(我想)在这方面。在我的代码中,我试图防止坐标越界。例如,对于(int b=Math.max(0,y-1);b u r使用二值化图像,你能删除该Math.max(0,y-1)并直接使用254吗?在这两种情况下,WRT x和y 254是什么意思?(即255-1?)上述代码中的x和y不是rgb值,而是循环通过的图像中像素的坐标。:)好的,还有一件事为什么在while循环中使用i,j=1的值,为什么不0我想我只是在测试它是否有区别。我现在在自己的代码中将它们改回了0。我将编辑这个问题-谢谢你指出:)
    /**
 * 
 * @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 );
                    }
            }
        }
  }