Я работаю над программой анализа изображений, и я сузил свое узкое место до попыток много раз подогнать 2D-гауссова к маленькому окну (20x20) пикселей. 90% времени выполнения тратится на этот код.
Я использую код, указанный в кулинарной книге scipy для этой проблемы:
def gaussian(height, center_x, center_y, width_x, width_y):
"""Returns a gaussian function with the given parameters"""
width_x = float(width_x)
width_y = float(width_y)
return lambda x,y: height*exp(
-(((center_x-x)/width_x)**2+((center_y-y)/width_y)**2)/2)
def moments(data):
"""Returns (height, x, y, width_x, width_y)
the gaussian parameters of a 2D distribution by calculating its
moments """
total = data.sum()
X, Y = indices(data.shape)
x = (X*data).sum()/total
y = (Y*data).sum()/total
col = data[:, int(y)]
width_x = sqrt(abs((arange(col.size)-y)**2*col).sum()/col.sum())
row = data[int(x), :]
width_y = sqrt(abs((arange(row.size)-x)**2*row).sum()/row.sum())
height = data.max()
return height, x, y, width_x, width_y
def fitgaussian(data):
"""Returns (height, x, y, width_x, width_y)
the gaussian parameters of a 2D distribution found by a fit"""
params = moments(data)
errorfunction = lambda p: ravel(gaussian(*p)(*indices(data.shape)) -
data)
p, success = optimize.leastsq(errorfunction, params, maxfev=50, ftol=1.49012e-05)
return p
Мне удалось вдвое сократить время выполнения, объединив функции errorfunction() и gaussian(), поэтому каждый раз, когда наименьший квадрат() вызывает errorfunction(), происходит один вызов функции вместо двух.
Это наводит меня на мысль, что большая часть оставшегося времени выполнения тратится на накладные расходы на вызовы функций, поскольку алгоритм наименьшего квадрата() вызывает errorfunction().
Есть ли способ уменьшить накладные расходы на вызов этой функции? Я в недоумении, так как наименьший квадрат() принимает функцию в качестве входных данных.
Заранее извиняюсь, если мое описание сбивает с толку, я инженер-механик по образованию и изучаю Python по ходу дела. Пожалуйста, дайте мне знать, если есть какая-либо другая информация, которая была бы полезна.
leastsq
--- не можете ли вы просто рассчитать моменты, которые вы уже делаете. - person ev-br   schedule 27.01.2013