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

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.