[英]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.