Я не знаю, имеет ли 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,