Как рассчитать центральную линию или базовую линию многоугольникаPython

Программы на Python
Ответить Пред. темаСлед. тема
Anonymous
 Как рассчитать центральную линию или базовую линию многоугольника

Сообщение Anonymous »

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

Код: Выделить всё

603,1220 600,1288 687,1304 691,1304 694,1304 726,1291 762,1278 801,1291 843,1307 846,1307 850,1307 924,1294 976,1285 1009,1294 1054,1310 1057,1310 1061,1310 1158,1298 1203,1291 1223,1298 1262,1314 1265,1314 1268,1314 1272,1314 1320,1298 1366,1285 1388,1301 1405,1310 1408,1310 1411,1310 1745,1323 1749,1323 1752,1323 1788,1304 1810,1294 1891,1294 1963,1307 2057,1327 2060,1327 2161,1310 2222,1301 2317,1314 2359,1317 2362,1317 2388,1314 2440,1304 2459,1314 2495,1336 2498,1336 2502,1336 2505,1336 2602,1317 2651,1307 2738,1317 2878,1336 2881,1336 2884,1336 2943,1320 2972,1314 3248,1323 3258,1262 3254,1203 603,1151 603,1220
< /code>
И это базовая линия приведенных выше координат: < /p>
603,1220 2138,1255 3258,1262
Я пытаюсь использовать Python's shapely.centroid для вычисления базовой линии, но без надежного результата.

Код: Выделить всё

from shapely import LineString, MultiPoint, Polygon, centroid

print(centroid(Polygon([(584, 1603), (580, 1654), (649, 1680), (652, 1680), (824, 1684), (827, 1684), (830, 1684), (918, 1661), (947, 1684), (950, 1684), (954, 1684), (957, 1684), (1061, 1671), (1106, 1687), (1109, 1687), (1113, 1687), (1116, 1687), (1187, 1664), (1343, 1690), (1346, 1690), (1732, 1671), (1758, 1671), (1797, 1671), (2158, 1693), (2161, 1693), (2164, 1693), (2193, 1677), (2196, 1677), (2239, 1700), (2242, 1700), (2245, 1700), (2248, 1700), (2320, 1680), (2323, 1680), (2404, 1703), (2407, 1703), (2411, 1703), (2667, 1687), (2712, 1684), (2719, 1687), (2771, 1710), (2774, 1710), (2777, 1710), (3261, 1693), (3267, 1638), (3264, 1570), (584, 1538), (584, 1603)])))
< /code>
Результат: < /p>
POINT (1920.3383138928723 1620.2116469627338)
Изображение:

edit: я забыл упомянуть, если это имеет значение или нет, у моего изображения есть следующие меры в этом регистрации: Imagewidth = "///"/43 ImageHeight = "5841"
После некоторого исследования я придумал этот код, хотя я не получаю центральную линию, кроме верхней строки полигона:

Код: Выделить всё

import numpy as np
import matplotlib.pyplot as plt

# Given polygon points (as x, y coordinates) for the shape
polygon_points = [
(603, 1220), (600, 1288), (687, 1304), (691, 1304), (694, 1304),
(726, 1291), (762, 1278), (801, 1291), (843, 1307), (846, 1307),
(850, 1307), (924, 1294), (976, 1285), (1009, 1294), (1054, 1310),
(1057, 1310), (1061, 1310), (1158, 1298), (1203, 1291), (1223, 1298),
(1262, 1314), (1265, 1314), (1268, 1314), (1272, 1314), (1320, 1298),
(1366, 1285), (1388, 1301), (1405, 1310), (1408, 1310), (1411, 1310),
(1745, 1323), (1749, 1323), (1752, 1323), (1788, 1304), (1810, 1294),
(1891, 1294), (1963, 1307), (2057, 1327), (2060, 1327), (2161, 1310),
(2222, 1301), (2317, 1314), (2359, 1317), (2362, 1317), (2388, 1314),
(2440, 1304), (2459, 1314), (2495, 1336), (2498, 1336), (2502, 1336),
(2505, 1336), (2602, 1317), (2651, 1307), (2738, 1317), (2878, 1336),
(2881, 1336), (2884, 1336), (2943, 1320), (2972, 1314), (3248, 1323),
(3258, 1262), (3254, 1203), (603, 1151), (603, 1220)
]

image_width = 4381
image_height = 5841

normalized_polygon_points = [(x / image_width, y / image_height) for x, y in polygon_points]

# Extract x and y coordinates from the polygon points
x_coords, y_coords = zip(*normalized_polygon_points)

# Create a dictionary to store top and bottom y-values for each x-coordinate
x_to_y_values = {}

for x, y in normalized_polygon_points:
if x not in x_to_y_values:
x_to_y_values[x] = {'top': y, 'bottom': y}
else:
# Update the top and bottom y-values for the x-coordinate
if y < x_to_y_values[x]['top']:
x_to_y_values[x]['top'] = y  # Update top
if y > x_to_y_values[x]['bottom']:
x_to_y_values[x]['bottom'] = y  # Update bottom

# Calculate the centerline by averaging the top and bottom y-values for each x-coordinate
centerline_points = []
for x in sorted(x_to_y_values.keys()):
top_y = x_to_y_values[x]['top']
bottom_y = x_to_y_values[x]['bottom']
center_y = (top_y + bottom_y) / 2  # Midpoint between top and bottom
centerline_points.append((x, center_y))

# Extract the centerline x and y points
centerline_x, centerline_y = zip(*centerline_points)

# Plot the polygon and the centerline
plt.figure(figsize=(10, 6))
plt.plot(x_coords, y_coords, label='Polygon', color='blue', linestyle='--', marker='o')
plt.plot(centerline_x, centerline_y, label='Centerline', color='red', marker='o')
plt.title('Polygon with Centerline')
plt.xlabel('X')
plt.ylabel('Y')
plt.legend()
plt.grid(True)
plt.show()


Подробнее здесь: https://stackoverflow.com/questions/789 ... -a-polygon
Реклама
Ответить Пред. темаСлед. тема

Быстрый ответ

Изменение регистра текста: 
Смайлики
:) :( :oops: :roll: :wink: :muza: :clever: :sorry: :angel: :read: *x)
Ещё смайлики…
   
К этому ответу прикреплено по крайней мере одно вложение.

Если вы не хотите добавлять вложения, оставьте поля пустыми.

Максимально разрешённый размер вложения: 15 МБ.

  • Похожие темы
    Ответы
    Просмотры
    Последнее сообщение
  • Как рассчитать центральную линию или базовую линию многоугольника
    Anonymous » » в форуме Python
    0 Ответы
    32 Просмотры
    Последнее сообщение Anonymous
  • Как рассчитать центральную линию или базовую линию многоугольника
    Anonymous » » в форуме Python
    0 Ответы
    48 Просмотры
    Последнее сообщение Anonymous
  • Как рассчитать центральную линию или базовую линию многоугольника
    Anonymous » » в форуме Python
    0 Ответы
    49 Просмотры
    Последнее сообщение Anonymous
  • Как рассчитать центральную линию или базовую линию многоугольника
    Anonymous » » в форуме Python
    0 Ответы
    35 Просмотры
    Последнее сообщение Anonymous
  • Как рассчитать центральную линию или базовую линию многоугольника
    Anonymous » » в форуме Python
    0 Ответы
    24 Просмотры
    Последнее сообщение Anonymous

Вернуться в «Python»