2014-06-10 2 views
1

У меня есть следующий код:Форсирование Python Numpy код

big_k = gabor((height * 2, width *2), (height, width)) 
for r_slice in range(0,radialSlices): 
    r_pixels = r_slice * radialWidth 
    for a_slice in range(0,angularSlices): 
    a_pixels = a_slice * angularWidth 
    k_win = big_k[height - r_pixels:2*height - r_pixels,width - a_pixels:2 * width - a_pixels] 
    result = np.sum(img * k_win) 

img является uint8 массив 640х480 и big_k является complex64 1280x960.

Этот код составляет 1024 640x480 матричных умножений и приведение к complex64.

Этот код занимает 2 секунды для запуска на моем macbook; Я ищу попытку получить ускорение порядка 100x. Что я могу сделать?

+0

Что вы на самом деле пытаетесь достичь? – nneonneo

+0

На самом деле, это просто похоже на большую свертку. Если это так, попробуйте одну из функций свертки Сципи или используйте метод свертки на основе FFT. – nneonneo

+0

Идея состоит в том, чтобы применить фильтр, центрированный в нескольких точках изображения, а затем взять сумму значений результата в каждой точке. Подумайте об этом, это похоже на свертку. Могу ли я просто сверлить два, а затем взять результаты в каждой точке? Не нужно было бы суммировать в этом случае AFAIK? Или я неправильно понял? – cjm2671

ответ

2

То, что вы делаете, похоже на свертку, поэтому я рекомендую попробовать его реализовать с помощью операции свертки. Конвекции могут быть рассчитаны очень эффективно с использованием подхода на основе БПФ и реализованы в SciPy как scipy.signal.fftconvolve.

Смежные вопросы