查找每个 ConnectedComponent 区域的邻域
Find neighborhood for each ConnectedComponent region
我使用 OpenCV 中的 SuperpixelSLIC 计算超像素并获取每个超像素的标签,现在我需要计算每个标签的邻域。例如,考虑下面数组中的 8 连通情况,标签 1 的邻域是 {2, 5},标签 2 的邻域是 {1, 3, 4, 5},标签 3 的邻域是 {2, 4},标签 4 的邻域是 {2, 3}
111223333
112222334
122233344
555244444
如何使用 opencv 有效地实现它?
不知道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 中的 SuperpixelSLIC 计算超像素并获取每个超像素的标签,现在我需要计算每个标签的邻域。例如,考虑下面数组中的 8 连通情况,标签 1 的邻域是 {2, 5},标签 2 的邻域是 {1, 3, 4, 5},标签 3 的邻域是 {2, 4},标签 4 的邻域是 {2, 3}
111223333
112222334
122233344
555244444
如何使用 opencv 有效地实现它?
不知道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,