查找每个ConnectedComponent区域的邻域

时间:2018-05-04 22:36:11

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

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

111223333
112222334
122233344
555244444

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

1 个答案:

答案 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,