如何裁剪多边形,使其在一个矩形区域内。

问题描述 投票:-1回答:1

所以我有一个 numpy 多边形阵列 (N, 2) 的范围内进行裁剪。256x256 所见影像 1. 也就是说,我想裁剪这个多边形,使其与黄色蒙板的边界相匹配。256x256 区域;输出的多边形应具有与该蒙板相当的面积,并具有与该蒙板相当的形状 (Mx2).

如图所示,我已经对多边形进行了栅格化处理,以创建二进制蒙版,使其在以下范围内。256x256. 然而,我还想裁剪多边形,使其与二进制蒙版的边界相匹配。如何才能做到这一点?我想用 shapely 通过创建一个矩形多边形 [(0,0), (0,256), (256,256), (256,0)]然而,我意识到可能有很多边缘情况需要处理。

  • 盒子与多边形相交,因此,我们要得到相交的多边形。
  • 框体完全在多边形内部,因此,输出的框体是
  • 多边形完全在框内,因此,输出原始多边形。
  • 交叉的结果是多个多边形,需要处理这个问题。

也许编写一些代码来处理这一切并不是那么糟糕,但是是否有某种库可以快速而简单地完成这些工作?

python computer-vision geometry polygon shapely
1个回答
0
投票

Shapely可以很好地解决你的问题。您的边缘情况是两个通用多边形相交的标准情况,您可以使用 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

© www.soinside.com 2019 - 2024. All rights reserved.