首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >查找每个ConnectedComponent区域的邻域

查找每个ConnectedComponent区域的邻域
EN

Stack Overflow用户
提问于 2018-05-04 22:36:11
回答 1查看 238关注 0票数 0

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

代码语言:javascript
运行
复制
111223333
112222334
122233344
555244444

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

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2018-05-05 06:51:39

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

如果您想自己构建它,可以使用这样的数据结构:

代码语言:javascript
运行
复制
std::unordered_map<int,std::set<int>> neighbors;

这是一个散列映射,它将标签(我使用int,用标记图像中使用的任何类型替换)与一组标签(邻居)相关联。

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

代码语言:javascript
运行
复制
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将为图像中的每个标签包含一个条目,迭代此条目将给出邻居的排序列表:

代码语言:javascript
运行
复制
label = 2;
std::cout << "Neighbors for label " << label << " are: ";
for(auto n : neighbors[label]) {
   std::cout << n << ", ";
}
std::cout << '\n';

在您的示例中,应该输出:

代码语言:javascript
运行
复制
Neighbors for label 2 are: 1, 3, 4, 5,
票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/50183908

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档