Если я понимаю ваш вопрос, вам нужна линия, проходящая через ваш объект, где каждая точка находится в середине объекта, т.е. если вы начинаете с любой точки средней линии и идете в направлении, перпендикулярном средней линии, вы должны Пройдите одинаковое расстояние в обоих направлениях, пока не встретите границу объекта:
(это просто иллюстрация - вероятно, не геометрически правильная средняя линия!)
Мое быстрое и грязное решение состояло бы в том, чтобы начать со средней оси (которую можно легко рассчитать по моментам первого и второго порядка) и уточнить ее, взяв каждую точку на этой линии и найти ближайшие граничные точки на линии, перпендикулярной к текущее направление в этой точке и переместите точку в геометрический центр этих двух точек:
Если вы делаете это для каждой точки, вы должны получить лучшее приближение для средней линии.
Я сказал, что это было быстро и грязно, потому что я не уверен, что просто повторение этой процедуры всегда приводит к стабильному решению. Вероятно, это зависит от того, как вы рассчитываете перпендикулярное направление средней линии при наличии изгибов и перегибов.
Одним из способов решения этой проблемы является использование более вдохновленной физикой модели:
- Рассчитать преобразование расстояния для внутренней части вашего объекта (расстояние каждой точки до ближайшей граничной точки)
- Найдите плавную линию через объект, которая максимизирует интеграл по траектории изображения с преобразованием расстояния:
Чтобы найти эту строку, я бы использовал алгоритм, аналогичный активным контурам / змеям:
- Начало со средней оси
- Применить две силы к каждой точке:
- Одна сила "толкает" линию в направлении градиента преобразования расстояния (то есть от ближайшей границы)
- Другая сила противодействует растяжению и изгибу змеи, поэтому она сохраняет плавную форму там, где нет четкого градиента преобразования расстояния. (Google для активного контура - это довольно стандартное резюме, вы найдете много хороших статей об этом.)
- Повторять до тех пор, пока не будет достигнута конвергенция или некоторый фиксированный предел итерации
Вам нужно будет отрегулировать несколько параметров для этой плавности кривой (как всегда с активными контурами), но ваши шансы получить хорошо определенное и хорошо себя зарекомендовавшее приближение намного выше, чем при простом подходе, описанном выше.