我目前正在尝试创建一些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++;
}
}
}
}
}
}
答案 0 :(得分:0)
一些提示:
由于您是从左上角到右下角扫描像素,因此您应该仅比较您已扫描的像素。所以你应该只比较左上,上,右和左像素。
然后,如果所有这些像素都是背景(这意味着您不知道连接此新像素的内容),则为此像素创建一个新标签:{{1} }
另一方面,如果您发现其中一个像素不是背景,则将其标签分配给此像素。对于instace,如果您发现左上角的像素不是背景的一部分,那么您将其标签传播到当前像素:NEIGHBOUR[v][u] = nextLabel++
。
执行此检查时,您可能还发现多个邻居的NEIGHBOUR[v][u] = NEIGHBOUR[v-1][u-1]
值不同。例如。 NEIGHBOUR[v][u]
。在这种情况下,
您将此信息添加到地图中,例如NEIGHBOUR[v-1][u-1]!=NEIGHBOUR[v-1][u+1]
。但这值得一个新问题。