【问题标题】:Shapely smoothing with dilate and erode使用扩张和腐蚀进行匀称平滑
【发布时间】:2023-02-02 03:18:26
【问题描述】:

我正在尝试使用 shapely 实现多边形平滑操作。我正在结合侵蚀和扩张(具有正数和负数的 polygon.buffer 函数)来执行此操作。我的平滑函数的规范是这样的:

  1. 操作必须保守。不得有任何部分 未被平滑形状覆盖的原始形状
  2. 必须保留任何突起
  3. 必须平滑任何凹陷
  4. 必须保留拓扑

    在拓扑不随操作改变的情况下,扩张后跟腐蚀可以很好地解决这个问题。请参阅下面的示例代码。

    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


    【解决方案1】:

    GEOS 最近添加了GEOSPolygonHullSimplify 功能。它可以计算多边形(和 MultiPolygons)的外壳和内壳。

    有关详细信息,请参阅以下博客文章:

    http://lin-ear-th-inking.blogspot.com/2022/04/outer-and-inner-concave-polygon-hulls.html http://lin-ear-th-inking.blogspot.com/2022/05/using-outer-hulls-for-smoothing.html

    听起来它符合您的要求:

    • (外壳的)结果覆盖了输入
    • 外壳保留突起并平滑凹陷
    • 保留了拓扑结构(即孔的数量保持不变)

    如果这现在不在 Shapely 中,应该很容易添加。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2017-10-26
      • 2013-03-29
      • 2020-03-19
      • 2012-09-08
      • 2012-09-22
      • 2014-07-26
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多