Быстрое нахождение пика и центроида в питоне

Я пытаюсь разработать быстрый алгоритм в Python для поиска пиков на изображении, а затем найти центр тяжести этих пиков. Я написал следующий код, используя scipy.ndimage.label и ndimage.find_objects для определения местоположения объектов. Это кажется узким местом в коде, и требуется около 7 мс, чтобы найти 20 объектов в изображении 500x500. Я хотел бы увеличить это изображение до 2000х2000, но время увеличивается почти до 100 мс. Так что я'Мне интересно, есть ли более быстрый вариант.

Вот код, который у меня есть, который работает, но работает медленно. Сначала я моделирую свои данные, используя несколько гауссовых пиков. Эта часть медленная, но на практике я буду использовать реальные данные, поэтому я неслишком сильно волнует ускорение этой части. Я хотел бы быть в состоянии найти вершины очень быстро.

import time
import numpy as np
import matplotlib.pyplot as plt
import scipy.ndimage
import matplotlib.patches 

plt.figure(figsize=(10,10))
ax1 = plt.subplot(221)
ax2 = plt.subplot(222)
ax3 = plt.subplot(223)
ax4 = plt.subplot(224)

size        = 500 #width and height of image in pixels
peak_height = 100 # define the height of the peaks
num_peaks   = 20
noise_level = 50
threshold   = 60

np.random.seed(3)

#set up a simple, blank image (Z)
x = np.linspace(0,size,size)
y = np.linspace(0,size,size)

X,Y = np.meshgrid(x,y)
Z = X*0

#now add some peaks
def gaussian(X,Y,xo,yo,amp=100,sigmax=4,sigmay=4):
    return amp*np.exp(-(X-xo)**2/(2*sigmax**2) - (Y-yo)**2/(2*sigmay**2))

for xo,yo in size*np.random.rand(num_peaks,2):
    widthx = 5 + np.random.randn(1)
    widthy = 5 + np.random.randn(1)
    Z += gaussian(X,Y,xo,yo,amp=peak_height,sigmax=widthx,sigmay=widthy)

#of course, add some noise:
Z = Z + scipy.ndimage.gaussian_filter(0.5*noise_level*np.random.rand(size,size),sigma=5)    
Z = Z + scipy.ndimage.gaussian_filter(0.5*noise_level*np.random.rand(size,size),sigma=1)    

t = time.time() #Start timing the peak-finding algorithm

#Set everything below the threshold to zero:
Z_thresh = np.copy(Z)
Z_thresh[Z_thresh

Ответы на вопрос(4)

Ваш ответ на вопрос