Найти окрестности для каждого региона ConnectedComponent - PullRequest
0 голосов

Я использовал SuperpixelSLIC из OpenCV для вычисления суперпикселей и получения меток каждого, теперь мне нужно вычислить окрестность для каждой метки. Например, учитывая 8-связанный случай в приведенном ниже массиве, окрестность для метки 1 es {2, 5}, для метки 2 - {1, 3, 4, 5}, для 3 - {2, 4} и для 4 это {2, 3}

111223333
112222334
122233344
555244444

Как я могу эффективно реализовать это с помощью opencv?

1 Ответ

0 голосов
/ 05 мая 2018

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