Удалить внешнюю оболочку 2D точек рассеяния в Python - PullRequest
0 голосов
/ 26 мая 2018

Для моего проекта я использую 2D-изображения с телескопа.Известно, что внешняя граница каждого изображения перегружена точками из-за неисправности телескопа.Поэтому я хочу извлечь точки, которые составляют внешнюю границу 2D-изображения.

Итак, я хочу как-то извлечь точки, которые составляют внешнюю оболочку, с желаемой шириной оболочки в соответствии св моем предпочтении.

То, что я пробовал до сих пор:

В Python я пытался найти точки, составляющие ребро, используя scipy.ConvexHull, чтобы найти внешние точки, а затем удалив этиточки.Делая это в цикле, он должен удалить внешнее ребро с шириной, зависящей от количества итераций.Однако этот метод зависит от плотности точек и удаляет меньше точек для мест на краю, где плотность велика.То, что я хочу, это то, что примерно равная ширина внешнего края удаляется из всего изображения, см. Изображения ниже:

Чтобы показать, что я имею в виду, я добавил результат ConvexHull, красным цветом точки, которые он дает как внешниеточки ребра после 15x итераций: picture1

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

1 Ответ

0 голосов
/ 27 мая 2018

Поскольку вы демонстрировали только идеи и графику без кода, я сделаю то же самое.

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

Перед выбором многоугольника вы можете найти «центральную точку»вашего выпуклого корпуса.Есть несколько способов определить это.Вы можете использовать центр тяжести вершин корпуса, где координаты x и y являются средними значениями координат вершин, но это смещает в сторону частей корпуса со многими небольшими сегментами.Вы можете использовать центр ограничивающего прямоугольника, где координаты x и y являются средним значением максимума и минимальных координат вершин корпуса.Это подход, который я использовал в моей графике.Есть и другие возможные «центральные точки».

Мой первый внутренний многоугольник перемещает каждую вершину на пропорциональное расстояние к центральной точке .В моем примере я переместил каждую точку на одну четверть расстояния к центральной точке.

enter image description here

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

enter image description here

Мой третий полигон покидаетЦентральная точка.Он перемещает каждую сторону корпуса на фиксированное расстояние к внутренней части корпуса .Пересечения этих новых сегментов используются для определения нового многоугольника.Другими словами, я сделал «смещение внутренних полигонов» или «буферизацию полигонов».Это нетривиальная задача в вычислительной геометрии, но некоторое обсуждение этой задачи и подобных задач можно найти на этом вопросе .Это выглядит не так, как у других полигонов, так как меньшие стороны корпуса имеют тенденцию уменьшаться или полностью исчезать из результата.

enter image description here

Выберите любой полигонудовлетворяет вашим потребностям - первые два легче вычислить, чем третий, но третий приближается к вашему идеалу «равной ширины внешнего края».

...