Python: вычисление площади контура

Я хочу вычислить область внутри контура неизвестной функции. Значения моей функции хранятся в массиве Numpy, который при построении выглядит следующим образом: введите описание изображения здесь

Я хотел бы рассчитать площадь поперечного сечения на разных высотах, например 50% от высоты пика.

Кроме того, иногда вокруг функции присутствует шум, а значит и другие пики, что означает, что контур на определенной высоте может привести к созданию более одной области. Меня интересует только область внутри контура, которая окружает «пик интереса», если смотреть сверху.

«Пик интереса» – это тот, который показан красной точкой на вершине на диаграмме выше. У меня есть алгоритм, который идентифицирует пик интереса, поэтому я всегда знаю, какой именно пик мне интересен.

Кто-нибудь может мне с этим помочь? Большое спасибо


Я нашел этот вопрос , но я не могу заставить данный пример работать. У меня возникают проблемы с линией vs = contour.get_paths()[0].vertices , индекс списка находится за 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)) по 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)) с 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] , видимо, индекс списка выходит за пределы диапазона. Я пробовал каждую модификацию кода, который я могу придумать, чтобы заставить это работать, но у меня теперь нет идей.


Интересно, что если я запускаю код по строкам, то он не сбой и не дает мне выход, хотя это невероятно маленькое значение


Интересно, что я в конечном итоге получил этот код, работающий над простым случаем, где заключен только пик интереса. Я понятия не имею, что я изменил из приведенного выше кода, чтобы заставить его работать. Мне все же хотелось бы, чтобы какая-то помощь определяла, какую область рассчитывать в случае присутствия нескольких пиков. Пожалуйста, дайте мне знать, можете ли вы помочь мне с этим

Python - лучший язык программирования в мире.