функция python для поиска локальных максимумов/пиков из массива

я пытаюсь обнаружить локальные максимумы из данного массива. Массив представляет собой синусоидальную кривую, полученную после вычисления линейного преобразования. Вот изображениевведите здесь описание изображения

Вот пустой файл accumulator.npy. Ясно, что имеются два локальных максимума. Мне было интересно, как лучше всего обнаружить эти два максимума. Кроме того, как я могу построить обратные линии после нахождения максимумов? Спасибо.


person Anil Yadav    schedule 03.12.2019    source источник
comment
Нет прав на чтение файла????   -  person Mark Setchell    schedule 04.12.2019
comment
@MarkSetchell Файл теперь доступен. Прости за это!   -  person Anil Yadav    schedule 04.12.2019


Ответы (1)


Вы можете использовать функцию skimage peak_local_max(), чтобы найти пики. Кажется, их больше, чем вы ожидаете, поэтому я добавил сглаживание по Гауссу, чтобы вы могли поэкспериментировать.

В конце также есть некоторый график, который позволяет вам лучше визуализировать данные в 3D, но вы можете игнорировать это.

#!/usr/bin/env python3

from mpl_toolkits import mplot3d
import numpy as np
import matplotlib.pyplot as plt
from scipy import ndimage as ndi
from skimage.feature import peak_local_max
from skimage import img_as_float

# Load data and find maxima
data = np.load('accum.npy')
im = img_as_float(data)
image_max = ndi.maximum_filter(im, size=20, mode='constant')

# Experiment with various smoothing parameters
for sigma in range(4):
    coordinates = peak_local_max(ndi.gaussian_filter(im,sigma=sigma), min_distance=20)
    print(f"Sigma for smoothing: {sigma}, coordinates of peaks:")
    print(coordinates)

# Plotting stuff
sigmaForPlot=0
fig = plt.figure()
ax = plt.axes(projection='3d')
x = np.outer(np.ones(800),np.arange(300))
y = np.outer(np.arange(800), np.ones(300))
ax.plot_surface(x, y,ndi.gaussian_filter(im,sigma=sigmaForPlot),cmap='viridis', edgecolor='none')
ax.set_title('Surface plot')
plt.show()

Пример вывода

Sigma for smoothing: 1, coordinates of peaks:
[[595 113]
 [589  36]
 [448  80]
 [400 144]
 [351 260]
 [251 166]
 [210 216]]
Sigma for smoothing: 2, coordinates of peaks:
[[589  36]
 [399 144]
 [239 170]
 [210 216]]
Sigma for smoothing: 3, coordinates of peaks:
[[589  36]
 [398 145]
 [210 216]]

введите здесь описание изображения

person Mark Setchell    schedule 04.12.2019
comment
Размер массива (142 x 180), поэтому я не понимаю, как координаты (строка и столбец) превышают размер изображения. например, [[595 113]] представляет 595 строку и 113 столбец? Если да, то как это может быть? - person Anil Yadav; 05.12.2019
comment
Файл, который я получил по ссылке, имеет размер 800x300! ???? Код должен работать точно так же, если вы поменяете каждые 800 на 142 и каждые 300 на 180. - person Mark Setchell; 05.12.2019