2009-07-08 26 views
20

Có một mối tương quan chéo hoặc hàm thập phân 2D dựa trên FFT được xây dựng thành scipy (hoặc một thư viện phổ biến khác) không?Phép biến đổi và tương quan 2D dựa trên FFT trong Python

Có chức năng như thế này:

  • scipy.signal.correlate2d - "phương pháp trực tiếp thực hiện bởi convolveND sẽ chậm đối với dữ liệu lớn"
  • scipy.ndimage.correlate - "Mảng được tương quan với các hạt nhân được sử dụng chính xác tính toán (tức là không phải FFT). "
  • scipy.fftpack.convolve.convolve, mà tôi không thực sự hiểu, nhưng có vẻ như sai

numarray đã có một correlate2d() function with an fft=True switch, nhưng tôi đoán numarray được gấp vào numpy, và tôi không thể tìm thấy nếu chức năng này đã được bao gồm.

+1

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). –

+0

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

+1

Ồ, 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

Trả lời

17

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]]) 

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 inputusing 5-smooth lengths instead of powers of 2: D).

4

Tôi nghĩ rằng bạn muốn gói scipy.stsci:

http://docs.scipy.org/doc/scipy/reference/stsci.html

In [30]: scipy.__version__ 
Out[30]: '0.7.0' 

In [31]: from scipy.stsci.convolve import convolve2d, correlate2d 
+0

Tôi thấy điều đó, nhưng nó không ' t dường như được bao gồm trong SciPy nữa? >>> import scipy.stsci.convolve Traceback (gần đây nhất gọi cuối cùng): File "", dòng 1, trong ImportError: Không có mô-đun tên cây dây leo – endolith

+0

Hi - Tôi dán đầu ra từ dấu nhắc của tôi ở trên. Phiên bản của bạn là gì? – ars

+0

Rõ ràng có điều gì đó sai: http://pastebin.com/mdd2bc6d Tốt để biết điều đó tồn tại. – endolith

2

Tôi đã mất theo dõi tình trạng của gói này trong scipy, nhưng tôi biết chúng tôi bao gồm ndimage như một phần của gói phát hành stsci_python như là một tiện nghi cho người sử dụng của chúng tôi:

http://www.stsci.edu/resources/software_hardware/pyraf/stsci_python/current/download

hoặc bạn sẽ có thể kéo nó ra khỏi repositor y nếu bạn thích:

https://www.stsci.edu/svn/ssb/stsci_python/stsci_python/trunk/ndimage/

+0

Theo tài liệu SciPy nó không phải dựa trên FFT, mặc dù, như tôi đã đề cập trong câu hỏi. http://www.scipy.org/SciPyPackages/Ndimage – endolith

+1

Gói convolve cũng có sẵn từ kho lưu trữ stsci_python. Nó bao gồm hàm correlate2d có công tắc fft = True mà bạn cũng đã đề cập. https://www.stsci.edu/svn/ssb/stsci_python/stsci_python/trunk/convolve/lib/Convolve.py –

+0

Oh! Tôi chỉ có thể nhập trực tiếp tệp python đó, nếu tôi xóa tham chiếu đến _correlate. Mối tương quan FFT là tất cả trong Python. Bây giờ tôi đã có nó làm việc. :) Cảm ơn! – endolith

6

nhìn vào scipy.signal.fftconvolve, signal.convolve và signal.correlate (có một signal.correlate2d nhưng có vẻ như để trả lại một mảng thay đổi, không làm trung tâm).

+0

Tôi đã thay đổi câu trả lời được chấp nhận của mình thành điều này, như được giải thích dưới đây http://stackoverflow.com/questions/1100100/fft-based-2d-convolution-and-correlation-in-python/1768140#1768140 – endolith

2

Tôi đã viết một trình bao bọc chéo/liên kết chéo để xử lý phần đệm & và bao gồm một trình bao bọc mịn đơn giản here. Nó không phải là một gói phổ biến, nhưng nó cũng không có phụ thuộc bên cạnh numpy (hoặc fftw cho ffts nhanh hơn).

Tôi cũng đã triển khai mã kiểm tra tốc độ FFT here trong trường hợp ai đó quan tâm. Nó cho thấy - đáng ngạc nhiên - đó là fump của numpy là nhanh hơn scipy, ít nhất là trên máy tính của tôi.

EDIT: chuyển mã để N-chiều phiên bản here

Các vấn đề liên quan