如何合并连接组件标签中的标签

时间:2013-11-19 07:13:55

标签: java image-processing computer-vision labeling

嗨,我必须找出图像中有多少个物体。

http://en.wikipedia.org/wiki/Connected-component_labeling

我需要帮助存储邻居之间的等价以及第二遍。这个传球给了我173个左右的物体,是第一次传球。我想存储等价(当它们出现时),然后在第二遍中,以便能够用最低的等价值替换相应的等价。

1 个答案:

答案 0 :(得分:1)

可以使用HashMap来实现等价表。每次找到与另一个标签等效的标签时,只需将该关系添加到哈希映射中即可。

final Map<Integer, Integer> equivalenceTable = new HashMap<>();

因此,每当您找到两个相同的标签时,只需将它们放在等价表中即可。

private void storeEquivalence(final Integer label0, final Integer label1, final Map<Integer, Integer> table) {
  if (table.keySet().contains(label0)) {
    table.put(label1, table.get(label0));
  }
  else if (table.keySet().contains(label1)) {
    table.put(label0, table.get(label1));
  }
  else {
    table.put(label0, label1);
  }
}

因此,当您确定region[x-1][y]region[x][y-1]相等时,您应该检查标签是否不同(它们应该是)并通过调用来更新等价表

 storeEquivalence(region[x-1][y], region[x][y-1], equivalenceTable);

然后在第二遍中,您只需替换等价表中具有值的每个标签。

for (int x = 1; x < imageTwo.getWidth(); x++) {
  for (int y =1; y < imageTwo.getHeight(); y++) {
    if (equivalenceTable.keySet().contains(region[x][y])) {
      region[x][y] = equivalenceTable.get(region[x][y]);
    }  
  }
}