我正在计算未知函数轮廓内的面积。我的函数值保存在Numpy数组中,绘制时如下所示:
我想计算不同高度的横截面积,例如峰高的50%。
此外,有时在特征周围会产生噪声,因此其他峰值也会产生噪声,这意味着特定高度的轮廓可能会导致创建多个区域。如果从上面看,我只对围绕“感兴趣的峰值”的轮廓内的区域感兴趣。
“感兴趣的峰值”是上图中红点所示的顶点。我有一个识别感兴趣峰值的算法,所以我总是知道我感兴趣的特定峰值。
任何人都可以帮我吗? 非常感谢
我找到this question,但我无法运行给定的示例。我遇到了行vs = contour.get_paths()[0].vertices
的问题,列表索引超出了范围。
我还需要调整代码以确保该区域包含峰值位置
这是尝试查找区域的代码部分 水平= [0.5,0.75]
calc_levels = (radial[x_peak,y_peak])*np.transpose(levels)
cs = plt.contour(Z,X_,radial, levels = calc_levels,colors='k')
plt.clabel(cs, inline=2, fontsize=10)
for loop in range(len(levels)):
vs = None
contour_ = None
contour_ = cs.collections[loop]
vs = contour_.get_paths()[0].vertices
ax.scatter(vs[:,0],vs[:,1],calc_levels[loop],c='red',s=20)
# Compute area enclosed by vertices
a = area(vs)
features['Radial_Area_' + str(levels[loop]*100)] = area(vs)
print("r = {}: a = {}".format(levels[loop],a))
,其中
def area(vs):
a = 0
x0,y0 = vs[0]
for [x1,y1] in vs[1:]:
dx = x1-x0
dy = y1-y0
a += 0.5*(y0*dx - x0*dy)
x0 = x1
y0 = y1
return a
如本问题中链接帖子中的示例所示。但是,它的代码总是在行contour_ = cs.collections[loop]
上崩溃,显然列表索引超出了范围。我已经尝试过每次修改我能想到的代码来实现这个功能,但我现在已经没有想法了。
有趣的是,如果我逐行运行代码,那么它不会崩溃并且确实给我输出,即使它是一个不可思议的小值
有趣的是,我最终得到了这个代码处理简单的情况,其中只包含感兴趣的峰值。我不知道我从上面的代码改变了什么来让它工作。我仍然想要一些帮助来确定在存在多个峰值的情况下要计算哪个区域。如果您能帮助我,请告诉我