2009-07-08 5 views
20

में एफएफटी-आधारित 2 डी रूपांतरण और सहसंबंध, क्या कोई एफएफटी-आधारित 2 डी क्रॉस-सहसंबंध या संकल्प फ़ंक्शन scipy (या एक और लोकप्रिय लाइब्रेरी) में बनाया गया है?पाइथन

वहाँ इस तरह के कार्य हैं:

  • scipy.signal.correlate2d -
  • scipy.ndimage.correlate "प्रत्यक्ष विधि convolveND द्वारा कार्यान्वित बड़े डेटा के लिए धीमी गति से हो जाएगा" - "सरणी सटीक का उपयोग कर दिया गिरी साथ जोड़ा जाता है गणना (यानी एफएफटी नहीं)। "
  • scipy.fftpack.convolve.convolve है, जो मैं वास्तव में समझ में नहीं आता है, लेकिन लगता है गलत

numarray एक correlate2d() function with an fft=True switch था, लेकिन मुझे लगता है कि numarray numpy में मुड़ा हुआ था, और मैं नहीं मिल सकता है अगर यह समारोह शामिल किया गया था।

+1

टिप्पणी कि सटीक गणना का उपयोग कर (कोई FFT) वास्तव में उन्होंने कहा कि यह धीमी है :) अधिक बिल्कुल के रूप में एक ही है एन आयामी करने के लिए कोड में ले जाया गया, FFT आधारित पद्धति बहुत तेजी से करता है, तो हो सकता है आपके पास सिग्नल और लगभग उसी आकार का कर्नेल है (यदि कर्नेल इनपुट से बहुत छोटा है, तो एफएफटी वास्तव में प्रत्यक्ष गणना से धीमा हो सकता है)। –

+0

आदर्श रूप से, एफएफटी एल्गोरिदम स्वचालित रूप से शून्य-पैडिंग चीजों का सही आकार के लिए सही आकार में ख्याल रखेगा। – endolith

+1

ओह आप शून्य पैडिंग के बारे में बात नहीं कर रहे हैं, आप 2000x2000 छवि के साथ 5x5 छवि से मेल खाने के बारे में बात कर रहे हैं। एल्गोरिदम क्यों अनुमान लगा सकता है कि एफएफटी अधिक कुशल होगा और इसे किस तरह से तेज कर देगा? – endolith

उत्तर

17

मैं scipy.signal.fftconvolve पाया, as also pointed out by magnus, लेकिन समय है कि यह n आयामी है पर एहसास नहीं था। चूंकि यह अंतर्निहित है और सही मूल्यों का उत्पादन करता है, यह आदर्श समाधान की तरह लगता है।

Example of 2D Convolution से

:

सही! दूसरी तरफ, एसटीएससीआई संस्करण, सीमाओं को सही बनाने के लिए कुछ अतिरिक्त काम की आवश्यकता है?

In [4]: stsci.convolve2d(a, b, fft = True) 
Out[4]: 
array([[-12., -12., -12.], 
     [-24., -24., -24.], 
     [-12., -12., -12.]]) 

(STScI विधि भी संकलन है, जो मैं के साथ (मैं सिर्फ बाहर टिप्पणी की गैर अजगर भागों), this जैसे कुछ कीड़े है असफल रहा था और आदानों (संशोधित करने की आवश्यकता है [1, 2] हो जाता है [[ । 1, 2]]), आदि तो मैं मेरे द्वारा स्वीकृत जवाब में निर्मित fftconvolve() समारोह)

सहसंबंध के लिए बदल दिया, निश्चित रूप से, घुमाव के रूप में एक ही बात है, लेकिन एक इनपुट के साथ उलट:

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 का विस्तार किया गया है आंतरिक रूप से दो आकारों का उपयोग करके (और फिर मैंने using real FFT for real input और using 5-smooth lengths instead of powers of 2 द्वारा इसे और अधिक बढ़ाया: डी)।

4

मुझे लगता है कि आप 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

मैंने यह भी देखा, लेकिन यह ' प्रतीत होता है कि विज्ञान में अब शामिल नहीं है? >>> आयात scipy.stsci.convolve Traceback (सबसे हाल कॉल पिछले): फ़ाइल "", लाइन 1, ImportError में: नहीं मॉड्यूल नामित convolve – endolith

+0

हाय - मैं ऊपर मेरी शीघ्र से उत्पादन चिपकाया। आपका संस्करण क्या है? – ars

+0

स्पष्ट रूप से कुछ गलत है: http://pastebin.com/mdd2bc6d यह जानना अच्छा है कि यह मौजूद है। – endolith

2

मैं scipy में इस पैकेज की स्थिति का ट्रैक खो दिया है, लेकिन मैं जानता हूँ कि हम के हिस्से के रूप में शामिल हैं ndimage

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

या आप में सक्षम यह repositor से पुल होना चाहिए: हमारे उपयोगकर्ताओं के लिए एक सुविधा के रूप stsci_python रिहाई पैकेज y यदि आप पसंद:

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

+0

SciPy दस्तावेज़ों के अनुसार यह एफएफटी-आधारित नहीं है, हालांकि, जैसा कि मैंने प्रश्न में उल्लेख किया है। http://www.scipy.org/SciPyPackages/Ndimage – endolith

+1

संकल्प पैकेज stsci_python भंडार से भी उपलब्ध है। इसमें correlate2d फ़ंक्शन शामिल है जिसमें fft = True switch है जिसका आपने भी उल्लेख किया है। https://www.stsci.edu/svn/ssb/stsci_python/stsci_python/trunk/convolve/lib/Convolve.py –

+0

ओह! यदि मैं _correlate के संदर्भ को हटा देता हूं, तो मैं केवल उस पायथन फ़ाइल को सीधे आयात कर सकता हूं। एफएफटी सहसंबंध पाइथन में सब कुछ है। अब मुझे यह मिल गया है। :) धन्यवाद! – endolith

6

scipy.signal.fftconvolve, signal.convolve और signal.correlate पर नज़र (वहाँ एक signal.correlate2d है लेकिन यह एक स्थानांतरित कर दिया सरणी, केंद्रित नहीं लौटने के लिए लगता है)।

+0

मैंने इसके स्वीकार्य उत्तर को बदल दिया है, जैसा कि नीचे बताया गया है http://stackoverflow.com/questions/1100100/fft-based-2d-convolution-and-correlation-in-python/1768140#1768140 – endolith

2

मैंने एक क्रॉस-सहसंबंध/रूपांतरण रैपर लिखा जो & नैन पैडिंग का ख्याल रखता है और इसमें एक साधारण चिकनी रैपर here शामिल है। यह एक लोकप्रिय पैकेज नहीं है, लेकिन इसमें numpy (या तेजी से ffts के लिए fftw) के अलावा कोई निर्भरता नहीं है।

मैंने किसी भी दिलचस्पी के मामले में एक एफएफटी स्पीड परीक्षण कोड here भी लागू किया है। यह दिखाता है - आश्चर्य की बात है - कम से कम मेरी मशीन पर, numpy की fft scipy की तुलना में तेज़ है।

संपादित करें: संस्करण here