Среднее расстояние двух отрезков в 2d / 3d - PullRequest
3 голосов
/ 13 сентября 2011

Введение: я работаю над задачей обработки изображения, пытаясь найти две границы объекта, которые можно описать двумя отрезками прямых линий. Я использую какой-то вариант преобразования грубой линии, чтобы найти отрезки линии на целевом изображении. Существует несколько линий, найденных преобразованием Хафа на границе объекта (с очень небольшим углом), и могут быть найдены некоторые линии, которые не соответствуют границам объекта где-то на изображении (ложные срабатывания). Поскольку пространственные отношения (угол) между двумя границами объекта приблизительно известны, я решил, что я бы использовал какой-то подход кластеризации, чтобы исключить ложные срабатывания и вычислить средний линейный сегмент из нескольких найденных сегментов линии в соответствии с граница.

Подход. Чтобы кластеризовать отрезки, необходимо определить меру сходства для местоположения каждого отрезка. Я подумал, что у меня будет набор углов между двумя отрезками и какое-то среднее расстояние между двумя отрезками. Это также, где я задаюсь вопросом, каков наилучший подход для расчета этой средней меры расстояния. Несколько простой подход состоял бы в том, чтобы произвести выборку каждого сегмента в отдельных местах и ​​измерить ближайшее расстояние (L2) каждой точки выборки до другого сегмента линии, суммировать расстояния и разделить сумму на количество выборок. Я уверен, что есть более умный способ сделать это, какие-либо предложения?

Подсказка: я работаю в C ++ с парой лицензированных инструментариев LGPL / BSD (OpenCV, Boost), поэтому некоторые специальные математические операции, такие как интеграция в mathematica, могут быть сложными для реализации.

Ответы [ 3 ]

1 голос
/ 14 сентября 2011

Вместо среднего расстояния, как насчет минимального расстояния? Существует расширенное обсуждение того, как вычислить это здесь .

1 голос
/ 13 сентября 2011

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

Я предполагаю, что у вас есть строки в виде значений пикселей. Начальную и конечную точки можно рассчитать путем нахождения максимального и минимального значений x и y пикселей линии.

0 голосов
/ 03 января 2017

Учитывая набор из n линейных сегментов, причем i-й линейный сегмент простирается от точки (x0i, y0i) до (x1i, y1i):

Посмотрите на первый сегмент линии и посмотрите, ближе ли онвертикальный или горизонтальный.Если abs (y00-y10)> abs (x00-x10), установите флаг и поменяйте местами координаты x и y.Это предотвратит проблему бесконечного наклона.(Я думаю, у вас все еще может быть проблема, если два отрезка линии были перпендикулярны, но если ваши отрезки линии настолько разные, средняя линия не имеет большого значения.)

Используя все 2n конечных точек, вычислите наименьшееквадраты, подходящие к прямой линии

y = a * x + b

Для каждой конечной точки вычислите abs (a * xij + b - yij).Это измеряет расстояние, параллельное оси Y этой конечной точки до средней линии.Я думаю, что если это больше, чем какая-то сумма, вы можете отклонить этот отрезок и повторить подбор без него.Если оно меньше пары пикселей, вы можете заменить координату y на подобранную, чтобы переместить этот конец отрезка линии на подобранную линию.

Если установлен флаг обмена, то поменяйте местами x иy назад.

...