алгоритм для отслеживания границы в 2D-массиве

У меня есть двумерный массив целых чисел, которые представляют группы (кристаллические зерна) на двумерной поверхности.что-то вроде этого: something like this (каждому пикселю этого изображения присваивается целое число в зависимости от группы, к которой он принадлежит, поэтому каждому красному пикселю присваивается 1, например, каждому синему - 2)

с учетом координаты X, Y на границе между двумя такими группами (пользователь щелкает там) как я могу отследить эту границу между этими двумя группами, сохраняя каждую пиксельную координату, которая находится вдоль границы, и получить две координаты конечной точки (меня не интересует случай корпуса, в котором не было бы конечной точки, но был бы цикл)

какой бы алгоритм я ни придумал, кажется утомительным для реализации, и я просто не могу представить, чтобы никто не делал этого раньше. Любая помощь? Предпочтительно решение на C #, но приветствуются любые подсказки об алгоритме.

РЕДАКТИРОВАТЬ:

Я должен был сказать, что я собирался реализовать алгоритм для векторизации этой строки следующим образом:

  1. между двумя конечными точками определить линию
  2. получить граничную точку, наиболее удаленную от текущей строки , если он дальше, чем d, разделите линию в этой точке, чтобы два отрезка
  3. повторялись до тех пор, пока ни одна граничная точка не находилась дальше, чем d от линейной полосы

Я думал, что это было достаточно легко реализовать, что почему я не сказал об этом. Чтобы добраться туда, мне просто нужно было решить текущую проблему ...

По поводу вопросов:

как форматируются необработанные данные? - это простая короткая [,] маркировка; с размером примерно 250x150 примерно так:

11111112222
11111222222
11112222222
11112222222 <- user clicks on leftmost 2 or rightmost 1 -> I want to trace that border
11111122222                                                down to the first
11111133322                                                encountered 3 and up to the
11333333333                                                frame-border

что такое конечная точка? - поскольку я думал о глобальных решениях, я мог бы описать конечную точку как: область 2x2, где 4 пикселя состоят из color1, color2 и, по крайней мере, одной трети другого цвета.

что непрерывно связано? - это не имеет особого значения для остальной части алгоритма, см. Ниже

а как насчет y-образных областей? - они меня не интересуют, вы Можно предположить, что область color1 за границей имеет ширину не менее 2 пикселей, поэтому также не имеет значения, говорим мы о 4-м или 8-м соседстве.

что у меня сейчас есть? - сначала я попробовал алгоритм «ходьбы», что-то вроде mvds опубликовал, но обнаружил, что выполняю пошаговое выполнение, вычисление соседей и проверку во всех 4 направлениях, что было утомительно и выглядело ужасно. Я не нашел подходящего выражения для фразы «это направление, откуда пришел последний шаг, не проверяйте этот пиксель на предмет соседства».

Затем я отказался от алгоритма ходьбы и попробовал глобальный подход (например, фильтр): для каждого пикселя проверяйте, является ли он цветом 1 И имеет ли он цвет 2 в его 4-окрестности. Таким образом я получаю все границы между цветом color1 и color2. Я собирался удалить все границы, которые не связаны с координатами, выбранными пользователем, с помощью какого-то типа заливки, но затем у меня возникла проблема: где же конечные точки?

Я все еще благодарен за дополнительную информацию. А пока я посмотрю, как далеко я могу зайти с алгоритмом mvds.

5
задан Markus Hütter 16 January 2012 в 12:03
поделиться