如何获得轮廓内的面积?

2024-09-26 18:18:09 发布

您现在位置:Python中文网/ 问答频道 /正文

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

谢谢

这是到目前为止我的代码。“点”是我要对其执行此操作的所有单个轮廓的列表

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


Tags: of图像区域forlenisnpnot
1条回答
网友
1楼 · 发布于 2024-09-26 18:18:09

假设点的顺序正确,直线不自相交,且直线形成完整的形状(在点[-1]到达点[1]之后),可以通过将各个部分有符号区域相加来计算are:

# 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。如果你不在乎,就拿最后的绝对值

这会给你一个很好的结果,但如果你有极值或很多点,要小心数值的不稳定性

相关问题 更多 >

    热门问题