【问题标题】:Find neighborhood for each ConnectedComponent region查找每个 ConnectedComponent 区域的邻域
【发布时间】:2018-10-15 11:18:59
【问题描述】:

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

111223333
112222334
122233344
555244444

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

【问题讨论】:

    标签: c++ opencv image-processing visual-c++ opencv3.0


    【解决方案1】:

    不知道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);
    }
    

    如果other 已经在集合中,insert 操作将无效,因此无需显式检查。

    在此过程结束时,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,
    

    【讨论】:

    • 是的,我做了类似的事情。 OpenCV 提供 2 个 Mat 变量:标签和轮廓(每个标签)。我迭代了轮廓(而不是只检查轮廓的标签)并检查了 8 连接邻域。我使用了一个辅助 Mat 变量来检查当前像素和邻居是否被访问以避免计算。不管怎样,谢谢你的建议
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2018-05-07
    • 1970-01-01
    • 2014-05-09
    • 2013-04-21
    • 1970-01-01
    • 1970-01-01
    • 2022-10-13
    相关资源
    最近更新 更多