我使用SuperpixelSLIC从OpenCV计算超像素,并得到每个标签,现在我需要计算每个标签的邻域。例如,考虑下面数组中的8连通情况,标签1 es {2,5},标签2的邻域是{1,3,4,5},3是{2,4},4是{2,3}。
111223333
112222334
122233344
555244444如何使用opencv有效地实现这一点?
发布于 2018-05-05 06:51:39
我不知道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,https://stackoverflow.com/questions/50183908
复制相似问题