Как обрезать полигон, чтобы он находился внутри прямоугольной области angular - PullRequest
0 голосов
/ 27 апреля 2020

Итак, у меня есть numpy массив многоугольников формы (N, 2), который я хочу обрезать так, чтобы он находился в границах 256x256 изображения, видимого в 1 . То есть я хочу обрезать этот многоугольник так, чтобы он совпадал с границами желтой маски внутри области 256x256; выходной многоугольник должен иметь площадь, эквивалентную этой маске, и иметь форму (Mx2).

. Как видно на рисунке, я уже растеризовал многоугольник, чтобы создать двоичную маску так, чтобы она находилась в границах 256x256. Однако я также хочу обрезать многоугольник так, чтобы он совпадал с границей двоичной маски. Как я могу это сделать? Я думал о том, чтобы сделать это с помощью shapely, создав прямоугольник angular многоугольник [(0,0), (0,256), (256,256), (256,0)], однако я понял, что может быть много крайних случаев, которые я должен обработать:

  • прямоугольник пересекается с многоугольником, поэтому мы хотим получить пересекающийся многоугольник
  • прямоугольник полностью внутри многоугольника, поэтому выведите прямоугольник
  • многоугольник полностью внутри прямоугольника, таким образом, вывести исходный многоугольник
  • Результаты пересечения приводят к нескольким многоугольникам, необходимо обработать это

Может быть, не так уж и плохо кодировать что-то для обработки всего этого, но есть ли какое-то библиотека, которая может сделать это быстро и легко?

1 Ответ

0 голосов
/ 28 апреля 2020

Shapely будет отлично работать для вашей проблемы. Ваши граничные случаи являются стандартными для пересечения двух общих c многоугольников, и вы можете использовать Polygon.intersection ( ссылка ). Если пересечение приводит к нескольким полигонам, то Polygon.intersection просто даст вам MultiPolygon. Вот пример для иллюстрации:

from shapely.geometry import Polygon
from shapely.affinity import scale,translate
import matplotlib.pyplot as plt
import numpy as np

# build squiggly polygon
theta=np.linspace(0,2*np.pi,100)
x=np.cos(theta)+0.1*np.sin(theta*10)
y=np.sin(theta)
A=Polygon(np.column_stack((x,y)))

# build a box
B=Polygon([[-.25,-1.5],[.25,-1.5],[.25,1.25],[-.25,1.25],[-.25,-1.5]])
# Intersection
C=A.intersection(B)
plt.subplot(2,2,1)
plt.plot(A.boundary.xy[0],A.boundary.xy[1],'k',label='A')
plt.plot(B.boundary.xy[0],B.boundary.xy[1],'b',label='B')
plt.plot(C.boundary.xy[0],C.boundary.xy[1],'--r',label='C')
plt.title('standard intersection')

# box in squiggly
B1=scale(B,0.5,0.5)
C=A.intersection(B1)
plt.subplot(2,2,2)
plt.plot(A.boundary.xy[0],A.boundary.xy[1],'k',label='A')
plt.plot(B1.boundary.xy[0],B1.boundary.xy[1],'b',label='B')
plt.plot(C.boundary.xy[0],C.boundary.xy[1],'--r',label='C')
plt.title('box in squiggly')

# squiggly in box
B1=scale(B,5,5)
C=A.intersection(B1)
plt.subplot(2,2,3)
plt.plot(A.boundary.xy[0],A.boundary.xy[1],'k',label='A')
plt.plot(B1.boundary.xy[0],B1.boundary.xy[1],'b',label='B')
plt.plot(C.boundary.xy[0],C.boundary.xy[1],'--r',label='C')
plt.title('squiggly in box')

# multipolygons
B1=translate(B,1.2,0)
C=A.intersection(B1)
plt.subplot(2,2,4)
plt.plot(A.boundary.xy[0],A.boundary.xy[1],'k',label='A')
plt.plot(B1.boundary.xy[0],B1.boundary.xy[1],'b',label='B')

for poly in C:
    plt.plot(poly.boundary.xy[0],poly.boundary.xy[1],'--r',label='C')

plt.title('multipolygons')
plt.show()

, который дает следующий рисунок

using shapely to find intersection of two polygons

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...