Эффективный алгоритм перебора всех пар соседей (двухточечных клик) в двумерном массиве.

Мне нужно перебрать все (неупорядоченные) пары пикселей в изображении, которые являются соседями друг друга без повторения. Я использую 8-балльную окрестность. Например:

  x,y| 0   1   2   3   4
  ---+---+---+---+---+---+
   0 |   |   |   |   |   |
     +---+---+---+---+---+
   1 | a | b | c | d |   |
     +---+---+---+---+---+
   2 | e | f | g | h |   |
     +---+---+---+---+---+
   3 | i | j | k | l |   |
     +---+---+---+---+---+
   4 |   |   |   |   |   |
     +---+---+---+---+---+

Соседи пикселя f находятся в квадрате 3x3 вокруг него. Таким образом, g, например, образует двухточечную клику с f. Если бы я перебрал все строки и столбцы изображения, эта клика была бы подсчитана дважды: один раз, когда f является центральным пикселем, и один раз, когда g является центром. пиксель. Аналогичная неэффективность будет иметь место и с остальными кликами.

Итак, что я хотел бы сделать, это перебрать все клики, а не каждый пиксель. Если бы я был знаком с теорией графов, я думаю, что некоторых ответов, уже данных на подобные вопросы, было бы достаточно, но поскольку я не знаком, я был бы очень признателен за любую помощь, которую вы можете дать с эффективным алгоритмом с точки зрения непрофессионала. Заранее спасибо!


person Gillespie    schedule 05.10.2014    source источник


Ответы (1)


Зациклить первую точку на всех точках. Внутренний цикл вторая точка над правым, нижним-левым, нижним и нижним-правым соседями (если они существуют).

person David Eisenstat    schedule 05.10.2014
comment
Спасибо, @David! Это довольно простой и понятный способ сделать это. Должен был подумать. Я запутался, пытаясь понять теорию графов и проблему клики в целом :). - person Gillespie; 05.10.2014