【问题标题】:How to get area inside a contour?如何获得轮廓内的区域?
【发布时间】:2020-10-29 18:19:33
【问题描述】:

我有一个轮廓,我想找到它的区域(后轮廓末端的图像是线索线,由蓝色的一组点描述)。我曾尝试为此使用 alphashape(见下文),但它对于我的目的来说效果不够好(图像上绿色轮廓的 alphashape 近似值)。我可以使用其他方法来获取此轮廓内的区域吗?

谢谢!

到目前为止,这是我的代码。 points 是我要执行此操作的所有单个轮廓的列表。

for cnum in np.arange(0,(len(points))): 
    cpoints_nan=points[cnum]
    cpoints=[]
    for i in np.arange(0, len(cpoints_nan)): #Get rid of nan pairs 
        if np.isnan(cpoints_nan[i][0]): #If current pair of points is [nan, nan]
            continue
        else: #If current pair of points is not nan, add to cpoints
            cpoints.append([cpoints_nan[i][0][np.logical_not(np.isnan(cpoints_nan[i][0]))][0], cpoints_nan[i][1][np.logical_not(np.isnan(cpoints_nan[i][1]))][0]])
    if len(cpoints)>3: #Need more than two points to use alphashape. Greater than 3 because for closed "loops" the last point is the first and so this will still just form a line rather than a polygon
        alpha=alphashape.optimizealpha(cpoints)
        hull = alphashape.alphashape(cpoints, alpha)
        contour_areas.append(hull.area) #Get area inside contour

编辑:我看到的许多轮廓都是自相交的,所以这是一个额外的复杂层

轮廓图:https://i.stack.imgur.com/qBnmv.png

【问题讨论】:

标签: python contour area


【解决方案1】:

假设点的顺序正确,线不会自相交并且线形成完整的形状(在点 [-1] 到点 [1] 之后),您可以通过将个别部分签名区域:

# p = cpoints
area = 0
for i in range(len(p) -1):
  area += (p[i][0] - p[i+1][0]) * (p[i][1] + p[i+1][1]) / 2
area += (p[i][0] - p[-1][0]) * (p[i][1] + p[-1][1]) / 2

对于每个线段,您计算它与 x 轴之间的面积。如果线向左,则增加面积,如果线向右,则减去面积。这为您提供了正确的区域,因为您添加了面向上的轮廓部分并减去了面向下的部分。

这对点的顺序很敏感(它们必须是三角函数才能给出正面积)。如果你的点顺时针乘以-1。如果您不在乎,请在最后取绝对值。

这应该会给你一个很好的结果,但如果你有极值或很多点,请注意数值不稳定。

【讨论】:

  • 谢谢,这很有用!但不幸的是,我必须处理的许多轮廓都是自相交的,鉴于我正在调查的问题的性质,这是我在找到该区域时需要保留的一个方面。有什么好的办法来处理这种情况吗?
  • 如果你有自相交,上面的算法会计算一部分正数和一部分负数,这样你就可以得到两个区域之间的差异。如果您知道您有简单的情况,例如单个交叉点,您可以尝试找到相交的线段并将形状分成 2 个,计算每个区域的面积并将它们相加。如果它更复杂,我会寻找其他东西。
猜你喜欢
  • 2015-02-02
  • 1970-01-01
  • 2015-04-29
  • 2022-06-10
  • 2018-10-10
  • 1970-01-01
  • 2016-10-24
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多