我目前正在尝试创建一些Java代码来进行连接组件标记。
有关其工作原理的一种解释在这里:http://aishack.in/tutorials/labelling-connected-components-example/
我已经在代码中找到了一个像素,并比较了它周围的所有像素。我现在完全迷失了,我很难找出我用来存储像素是背景像素,先前发现的对象还是新对象的内容。
我的问题是我该怎么称呼或更改以允许我存储这些值。先感谢您。
(为清晰起见,这是我到目前为止的代码)
private void connectedComponentLabelling(ImageProcessor ip) {
int w = ip.getWidth();
int h = ip.getHeight();
int background = 255; //black
int foreground = 0; //white
int nextLabel = 1;
int [] linked;
int [][] NEIGHBOUR = new int [w][h];
for (int v=0; v<h; v++){
for (int u=0; u<w; u++){
if (ip.getPixel(v,u) != background){
for (int j=-1; j<=1; j++){
for (int i=-1; i<=1; i++){
int p = ip.getPixel(v+j, u+i);
if (p != background){
//linked[nextLabel];
NEIGHBOUR[v][u] = nextLabel;
}else{
nextLabel++;
}
}
}
}
}
}
最佳答案
一些技巧:
由于您是从左上角到右下角扫描像素,因此您应该只比较已扫描的像素。因此,您应该只比较左上,上,右上和左像素。
然后,如果所有这些像素都是背景(这意味着您不知道该新像素如何连接),则为此像素创建一个新标签:NEIGHBOUR[v][u] = nextLabel++
另一方面,如果发现这些像素之一不是背景像素,则可以将其标签分配给该像素。对于instace,如果发现左上像素不是背景的一部分,则将其标签传播到当前像素:NEIGHBOUR[v][u] = NEIGHBOUR[v-1][u-1]
。
当您执行此检查时,您可能还会发现多个邻居具有不同的NEIGHBOUR[v][u]
值。例如。 NEIGHBOUR[v-1][u-1]!=NEIGHBOUR[v-1][u+1]
。在这种情况下,
您将此信息添加到地图上,例如connections.put(NEIGHBOUR[v-1][u-1],NEIGHBOUR[v-1][u+1])
。但这值得一个新问题。
关于java - Java中的连接组件标签,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/22914685/