Определить среднюю линию изогнутой, вытянутой области - PullRequest
8 голосов
/ 29 декабря 2010

Представьте, что у меня есть двухмерное изображение хот-дога.Я могу нарисовать прямую линию на хот-доге между двумя ее концами.Назовите это средней линией.Одним из его свойств является то, что это ось, относительно которой (2D) хот-дог имеет самый низкий момент инерции.

Теперь, если я согну хот-дог по дуге, эта средняя линия также будет искажаться.

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

Ответы [ 4 ]

5 голосов
/ 29 декабря 2010

Если я понимаю ваш вопрос, вам нужна линия, проходящая через ваш объект, где каждая точка находится в середине объекта, т.е. если вы начинаете с любой точки средней линии и идете в направлении, перпендикулярном средней линии, вы должны Пройдите одинаковое расстояние в обоих направлениях, пока не встретите границу объекта:

Hotdog with midline

(это просто иллюстрация - вероятно, не геометрически правильная средняя линия!)

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

Hotdog iteration 0

Если вы делаете это для каждой точки, вы должны получить лучшее приближение для средней линии.

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

Одним из способов решения этой проблемы является использование более вдохновленной физикой модели:

  • Рассчитать преобразование расстояния для внутренней части вашего объекта (расстояние каждой точки до ближайшей граничной точки)
  • Найдите плавную линию через объект, которая максимизирует интеграл по траектории изображения с преобразованием расстояния:

Distance transform

Чтобы найти эту строку, я бы использовал алгоритм, аналогичный активным контурам / змеям:

  • Начало со средней оси
  • Применить две силы к каждой точке:
    • Одна сила "толкает" линию в направлении градиента преобразования расстояния (то есть от ближайшей границы)
    • Другая сила противодействует растяжению и изгибу змеи, поэтому она сохраняет плавную форму там, где нет четкого градиента преобразования расстояния. (Google для активного контура - это довольно стандартное резюме, вы найдете много хороших статей об этом.)
  • Повторять до тех пор, пока не будет достигнута конвергенция или некоторый фиксированный предел итерации

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

3 голосов
/ 29 декабря 2010

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

Сначала вы должны thresold , а затем использовать алгоритм прореживания.

Вот несколько классных ссылок:

http://xphilipp.developpez.com/contribuez/Skeleton-Algorithm.pdf http://www -prima.inrialpes.fr / персидско / Tran / Проект / gateway.cfm.pdf http://www.geometrictools.com/Documentation/Skeletons.pdf

2 голосов
/ 29 декабря 2010

Если подход скелетонизации не работает, вы, вероятно, смотрите на более сложную проблему - которая поднимает ряд вопросов: насколько ограничены ваши фигуры? они всегда выпуклые? и т. д. В зависимости от ответов, вы можете рассмотреть вопрос о параметризации формы.

Для начала я бы рассмотрел вычисление выпуклой оболочки (google QHull) и затем определил триангуляцию Делоне формы. Оттуда, я полагаю, вы могли бы вычислить диаграмму Вороного и получить необходимую вам среднюю линию. Примечание: это большая работа - учитывая такой уровень усилий, было бы полезно посмотреть, можно ли просто настроить скелетонизацию, чтобы ее было достаточно.

0 голосов
/ 21 января 2011

Вы, вероятно, ищете диаграмму Вороного, которая даст вам все точки, которые равноудалены от краев «хот-дога» - например, путь / позвоночник / гребень / средняя линия вниз по середине.

И вот изображение, которое поможет визуализировать его: http://vision.ai.uiuc.edu/~sintod/images/research/VoronoiDiag.png

При отображении этого изображения на вашем примере жирные синие контуры - это ваши фигуры "хот-дога", а тонкий синий позвоночник / средняя линия внутридается диаграммой Вороного.Точки на этом срединном гребне одинаково удалены от тяжелых синих краев.

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