繁体   English   中英

估计对象数量超过点对象的连接组件标签

[英]Connected components labelling of point objects over estimating number of objects

我正在尝试在图像上实现8个连通性连接的组件标记算法,在该图像上突出显示某些点以标识连接的突出显示点的区域。

我的代码似乎可以正常工作,只是大量高估了对象的数量,例如,在突出显示500个点的图像中,它可能表示有2000个对象。

到目前为止(对于算法的第一遍)我的代码是:

    public int[][] connectedComp(int[][] array){     // Connected Compoent Labling method
            int nextlabel = 1;    
            for(int v =y1; v<y1 + height;v++){
                for(int u = x1;u<x1 + width;u++){
                    if(array[v][u]==1){
                        for (int j=-1; j<=1; j++){
                            for (int i=-1; i<=1; i++){
                                if(v+j>=0 && u+i>=0){
                                if(array[v+j][u+i]>0){

                                    array[v][u]= nextlabel;
                                }
                                else{
                                    array[v][u] = nextlabel++;
                                }
                                }
                            }
                        }    
                    }
                }
            }
            return array;
}

X1和Y1是我感兴趣的ROI的起始坐标,宽度和高度是所述ROI的尺寸。

谁能看到是什么原因造成的?

编辑

我更改了代码以仅比较已经访问过的像素,并且还稍微更改了结构。 如果不是很完美,现在效果更好。

这是更新的代码:

public int[][] connectedComp(int[][] array){     // Connected Compoent Labling method
            int nextlabel = 1;    
            for(int v =y1; v<y1 + height;v++){
                for(int u = x1;u<x1 + width;u++){
                    if(array[v][u]==1){
                        if(v-1>=0 && u-1>=0){
                            if(array[v-1][u-1]!=0){
                                array[v][u]= nextlabel;
                            }
                            if(array[v-1][u]!=0){
                                array[v][u]= nextlabel;
                            }
                            if(array[v-1][u+1]!=0){
                                array[v][u]= nextlabel;
                            }
                            if(array[v][u-1]!=0){
                                array[v][u]= nextlabel;
                            }
                            else{
                                array[v][u] = nextlabel++; 
                            }
                        }
                    }
                }                
            }
            return array;
}

我认为您的问题出在您的内部循环中。

假设您有一个被零包围的像素

for (int j=-1; j<=1; j++)
{
   for (int i=-1; i<=1; i++)
   {
      if(v+j>=0 && u+i>=0)
      {
         if(array[v+j][u+i]>0)
         {
            array[v][u]= nextlabel;
         }
         else{
            array[v][u] = nextlabel++;
         }
      }
   }
}

对于所有内部循环,您将继续增加标签,因为像素被零包围。 因此,如果循环末尾的nextlabel = someValue,则它将等于someValue + 9。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM