Через несколько дней после go я запустил сценарий, использующий scipy.signal.correlate2d для вычисления двухмерной автокорреляции изображения 4096x4096. Точный звонок:
zauto = signal.correlate2d(image, image, mode='full', boundary='wrap')
Три дня спустя он все еще работает, и конца не видно. В конце концов я понял, что это должна быть поэлементная свертка методом перебора, процедура, которая идет с N ^ 2, таким образом, 4096 ^ 4 = 281 триллион умножается и складывается.
Тем временем я в конце концов понял, что могу получить желаемый результат, взяв 2-мерное БПФ изображения, преобразовав его в 2-мерный спектр мощности, а затем используя обратное БПФ; т.е.
image -= np.mean(image) # remove constant bias
zfft = np.fft.fft2(image) # take 2-D FFT (complex)
zpower = zfft*np.conjug(zfft) # convert to power spectrum
zauto = np.real(np.ifft2(zpower)) # take inverse FFT
zauto /= zauto[0,0] # normalize
Для выполнения приведенных выше строк требуется менее одной минуты.
Мой вопрос: почему scipy.signal.correlate2d не включает хотя бы возможность использовать гораздо более эффективный алгоритм, когда это возможно, вместо того, чтобы позволить пользователю обнаружить на собственном опыте, что его просто нельзя использовать для больших изображений?