Вы говорите, что хотите упорядоченный результат P1, P2, ... P13?
Если это так, вам нужно найти выпуклую оболочку точек. Прогулка по окружности корпуса даст вам порядок точек, которые вам нужны.
В практическом смысле посмотрите на документацию OpenCV - вызов convexHull
с clockwise=true
дает вам вектор точек в нужном вам порядке. Ссылка для C ++, но там также есть API C и Python. Другие пакеты, такие как Matlab, должны иметь аналогичную функцию, поскольку это обычная геометрическая задача, которую нужно решить.
EDIT
Как только вы получите выпуклый корпус, вы можете итеративно свернуть его снаружи, чтобы получить оставшиеся точки. Ваши итерации прекратятся, когда в корпусе не останется больше пикселей. Вам нужно настроить свою функцию свертывания так, чтобы вначале учитывались более близкие точки, то есть, чтобы вы получили:
а не:
На обеих диаграммах зеленый является исходным выпуклым корпусом, остальные цвета - свернутые области.