Где я могу найти информацию об алгоритмах выращивания линий? - PullRequest
2 голосов
/ 30 марта 2009

Я занимаюсь некоторой обработкой изображений, и мне нужно найти некоторую информацию об алгоритмах нарастания строки - не уверен, что здесь я использую правильную терминологию, поэтому, пожалуйста, позвоните мне по этому вопросу.

Представьте, что мое входное изображение - это просто круг на черном фоне. Я хотел бы извлечь координаты, чтобы нарисовать этот круг в другом месте на основе координат.

Примечание: Я уже использую фильтры изображений с обнаружением краев, но я подумал, что это лучше объяснить на простом примере.

По сути, я собираюсь обнаружить строки на изображении и сохранить результат в типе данных, где, как я уже сказал, есть класс Line и различные объекты Point (содержащие координаты X / Y).

class Line
{
    Point points[];
}

class Point
{
    int X, Y;
}

И вот как бы я хотел это использовать ...

Line line;

for each pixel in image
{
    if pixel should be added to line
    {
        add pixel coordinates to line;
    }
}

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

Ответы [ 5 ]

3 голосов
/ 30 марта 2009

Я не уверен, правильно ли я вас интерпретирую, но стандартным способом является использование преобразования Хафа . Это двухэтапный процесс:

  1. По данному изображению определите, является ли каждый пиксель краевым пикселем (этот процесс создает новое «двоичное» изображение). Стандартный способ сделать это - Обнаружение канни по краям .

  2. Используя двоичное изображение краевых пикселей, примените преобразование Хафа. Основная идея такова: для каждого краевого пикселя вычислите все линии, проходящие через него, а затем возьмите линии, прошедшие через большинство краевых пикселей.

Редактировать: очевидно, вы ищете границу. Вот как ты это делаешь.

Вспомните, что детектор краев Canny также дает вам градиент (а не только величину). Поэтому, если вы выберете краевой пиксель и последуете (или против) этого вектора, вы найдете следующий краевой пиксель. Продолжайте до тех пор, пока вы больше не достигнете краевого пикселя, и ваша граница станет вашей.

1 голос
/ 30 марта 2009

При условии, что верно следующее:

  • Ваше изображение содержит одну фигуру на фоне
  • Вы можете определить, какие пиксели являются фоном, а какие - формой
  • Вы хотите только захватить границу за пределами фигуры (за исключением фигур в форме пончика, где вы хотите обвести внутренний круг)

Вы можете использовать алгоритм трассировки контуров, такой как алгоритм Мура-соседа .

Шаги:

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

  2. Найти следующий граничный пиксель . Пройдите по часовой стрелке вокруг последнего посещенного граничного пикселя, начиная с фонового пикселя, который вы последний раз посещали, прежде чем найдете текущий граничный пиксель.

  3. Повторяйте шаг 2, пока не вернетесь к первому граничному пикселю . После того как вы во второй раз посетите первый граничный пиксель, вы проследили всю границу фигуры и можете остановиться.

1 голос
/ 30 марта 2009

То, о чем вы говорите, не простая проблема! Я обнаружил, что этот сайт очень полезен при обработке изображений: http://homepages.inf.ed.ac.uk/rbf/HIPR2/wksheets.htm

Одна вещь, которую стоит попробовать - это Hough Transform , которая обнаруживает фигуры на изображении. Имейте в виду, это не легко понять.

Для обнаружения краев лучше всего подходит Обнаружение краев Canny , также нетривиальная задача для реализации.

0 голосов
/ 30 марта 2009

Просто чтобы повторить приведенные выше ответы, вы хотите выполнить обнаружение краев и преобразование Хафа.
Обратите внимание, что преобразование Хафа для круга немного сложнее (вы решаете для 3 параметров, x, y, радиуса), вы можете просто использовать библиотеку типа openCV

0 голосов
/ 30 марта 2009

Вы можете взглянуть на http://processing.org/ проект, созданный для обучения основам компьютерного программирования в визуальном контексте. Существует язык, основанный на java, и IDE для создания «эскизов». Это очень хороший пакет для быстрой работы с визуальными объектами, и в нем есть хорошие примеры таких вещей, как распознавание кромок , которые были бы полезны тебе.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...