我使用OpenCV的SuperpixelSLIC计算超像素并获得每个标签的标签,现在我需要计算每个标签的邻域。例如,考虑下面数组中的8连接情况,标签1 es {2,5}的邻域为标签2为{1,3,4,5},3为{2,4}且为4是{2,3}
111223333
112222334
122233344
555244444
如何使用opencv有效地实现这一点?
答案 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);
}
如果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,