我有一个轮廓,我想找到它的区域(后轮廓末尾的图像是线索线,由蓝色的点集描述)。我曾尝试使用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
编辑:我看到的许多轮廓都是自相交的,所以这是一个额外的复杂性层
假设点的顺序正确,直线不自相交,且直线形成完整的形状(在点[-1]到达点[1]之后),可以通过将各个部分有符号区域相加来计算are:
对于每条线段,计算其与x轴之间的面积。如果直线向左,则面积增加;如果直线向右,则面积减少。这将为您提供正确的区域,因为您为轮廓的朝上部分添加,为朝下部分减去
这对点的顺序很敏感(它们必须是三角意义上的,才能给出正面积)。如果点顺时针方向移动,则乘以-1。如果你不在乎,就拿最后的绝对值
这会给你一个很好的结果,但如果你有极值或很多点,要小心数值的不稳定性
相关问题 更多 >
编程相关推荐