代码之家  ›  专栏  ›  技术社区  ›  Pavel Angel Mendoza Villafane

查找每个ConnectedComponent区域的邻域

  •  0
  • Pavel Angel Mendoza Villafane  · 技术社区  · 6 年前

    我使用OpenCV中的SuperpixelSLIC来计算superpixels并获得每个超像素的标签,现在我需要计算每个标签的邻域。例如,考虑下面数组中的8连通情况,标签1的邻域是{2,5},标签2的邻域是{1,3,4,5},标签3的邻域是{2,4},标签4的邻域是{2,3}

    111223333
    112222334
    122233344
    555244444
    

    如何使用opencv高效地实现这一点?

    1 回复  |  直到 6 年前
        1
  •  1
  •   Cris Luengo    6 年前

    我不知道OpenCV对此是否有特定的功能。

    如果要自己构建,可以使用如下数据结构:

    std::unordered_map<int,std::set<int>> neighbors;
    

    这是一个关联标签的哈希映射(我使用 int ,替换为标记图像中使用的任何类型)到一组标签(邻居)。

    然后遍历每个像素,并检查其8个连通的邻域:

    int label = image[ii,jj];
    int other = image[ii+1,jj]; // this inside a loop over the neighborhood
    if (label != other) {
       neighbors[label].insert(other);
    }
    

    这个 insert 如果 other 已在集中,因此无需显式检查。

    在这一过程结束时, neighbors 将包含图像中每个标签的一个条目,并对该条目进行迭代将得到一个排序的邻居列表:

    label = 2;
    std::cout << "Neighbors for label " << label << " are: ";
    for(auto n : neighbors[label]) {
       std::cout << n << ", ";
    }
    std::cout << '\n';
    

    在您的示例中,应输出:

    Neighbors for label 2 are: 1, 3, 4, 5,