【发布时间】:2023-02-02 03:18:26
【问题描述】:
我正在尝试使用 shapely 实现多边形平滑操作。我正在结合侵蚀和扩张(具有正数和负数的 polygon.buffer 函数)来执行此操作。我的平滑函数的规范是这样的:
- 操作必须保守。不得有任何部分 未被平滑形状覆盖的原始形状
- 必须保留任何突起
- 必须平滑任何凹陷
- 必须保留拓扑
在拓扑不随操作改变的情况下,扩张后跟腐蚀可以很好地解决这个问题。请参阅下面的示例代码。
from shapely.geometry import Polygon import numpy as np from descartes import PolygonPatch from matplotlib import pyplot as plt # create a large square x = np.array([-5,-5,5,5]) y = np.array([5,-5,-5,5]) poly1 = Polygon(zip(x,y)) # smaller square to cut away from first x = np.array([-4,-4,4,4]) y = np.array([4,-4,-4,4]) poly2 = Polygon(zip(x,y)) # small shape to cut away from left side x = np.array([-11,-11,0,0]) y = np.array([1,-1,0,0]) poly3 = Polygon(zip(x,y)) poly_t=poly1.difference(poly2) poly4 = poly_t.difference(poly3) poly5= poly4.buffer(0.45) poly5= poly5.buffer(-0.45) fig = plt.figure() ax = fig.add_subplot(121) plt.axis([-5.5, 5.5, -5.5, 5.5]) patch = PolygonPatch(poly5) ax.add_patch(patch) plt.show()下面的可视化是应用平滑操作之前和之后。扩张操作的拓扑变化是意外行为的原因。形状多边形可以处于自相交的状态,在某种意义上它们是“无效的”。我希望中间多边形(已应用扩张,等待侵蚀的多边形)就是这种情况。但是,shapely 中的缓冲函数似乎没有这样的功能。
您对如何在 Shapely 仍然是几何引擎的情况下解决这个问题有什么建议吗?最坏的情况,使用另一个框架的解决方案。
【问题讨论】:
标签: python polygon shapely mathematical-morphology