Tôi đã tìm thấy scipy.signal.fftconvolve
, as also pointed out by magnus, nhưng không nhận ra tại thời điểm đó là n -dimensional. Kể từ khi nó được xây dựng trong và sản xuất các giá trị đúng, nó có vẻ như là giải pháp lý tưởng.
Từ Example of 2D Convolution:
đúng! Phiên bản STSCI, mặt khác, đòi hỏi một số công việc phụ để làm cho ranh giới chính xác?
In [4]: stsci.convolve2d(a, b, fft = True)
Out[4]:
array([[-12., -12., -12.],
[-24., -24., -24.],
[-12., -12., -12.]])
(Phương pháp STScI cũng đòi hỏi biên soạn, mà tôi đã không thành công với (Tôi chỉ nhận xét ra những phần không python), có một số lỗi như this và sửa đổi các đầu vào ([1, 2] trở thành [[ 1, 2]]), vv vì vậy, tôi đã thay đổi câu trả lời chấp nhận của tôi để được xây dựng trong fftconvolve()
chức năng)
tương quan, tất nhiên, là điều tương tự như chập, nhưng với một đầu vào đảo ngược:.
In [5]: a
Out[5]:
array([[3, 0, 0],
[2, 0, 0],
[1, 0, 0]])
In [6]: b
Out[6]:
array([[3, 2, 1],
[0, 0, 0],
[0, 0, 0]])
In [7]: scipy.signal.fftconvolve(a, b[::-1, ::-1])
Out[7]:
array([[ 0., -0., 0., 0., 0.],
[ 0., -0., 0., 0., 0.],
[ 3., 6., 9., 0., 0.],
[ 2., 4., 6., 0., 0.],
[ 1., 2., 3., 0., 0.]])
In [8]: scipy.signal.correlate2d(a, b)
Out[8]:
array([[0, 0, 0, 0, 0],
[0, 0, 0, 0, 0],
[3, 6, 9, 0, 0],
[2, 4, 6, 0, 0],
[1, 2, 3, 0, 0]])
và the latest revision đã được tăng tốc lên bằng cách sử dụng sức mạnh của hai kích thước nội bộ (và sau đó tôi tăng tốc nó lên nhiều hơn bởi using real FFT for real input và using 5-smooth lengths instead of powers of 2: D).
lưu ý rằng việc sử dụng tính toán chính xác (không FFT) là chính xác giống như nói rằng nó là chậm :) Chính xác hơn, phương pháp FFT dựa trên sẽ nhanh hơn nếu nhiều bạn có một tín hiệu và hạt nhân có cùng kích thước (nếu hạt nhân nhỏ hơn nhiều so với đầu vào, thì FFT thực sự có thể chậm hơn so với tính toán trực tiếp). –
Lý tưởng nhất, thuật toán FFT sẽ tự động xử lý những thứ không đệm với kích thước phù hợp với tốc độ tốt nhất. – endolith
Ồ, bạn không nói về không đệm, bạn đang nói về việc kết hợp một hình ảnh 5x5 với một hình ảnh 2000x2000. Tại sao thuật toán không thể đoán được liệu FFT có hiệu quả hơn và làm theo cách nào nhanh hơn? – endolith