WebHU - Programozási kérdések és válaszok

FFT-alapú 2D konvolúció és korreláció Pythonban

Van-e FFT-alapú 2D keresztkorrelációs vagy konvolúciós függvény beépítve a scipy-be (vagy más népszerű könyvtárba)?

Vannak ilyen funkciók:

  • scipy.signal.correlate2d - "a convolveND által megvalósított közvetlen metódus lassú lesz nagy adatok esetén"
  • scipy.ndimage.correlate - "A tömb pontos számítással (azaz nem FFT-vel) korrelál az adott kernellel."
  • scipy.fftpack.convolve.convolve, amit nem igazán értek, de rossznak tűnik

A numarray-nek volt egy correlate2d() függvénye fft=True kapcsolóval, de azt hiszem, a numarray numpy-ba volt hajtva, és nem találom, hogy ez a funkció benne volt-e.


  • vedd figyelembe, hogy a pontos számítást (nincs FFT) használni pontosan ugyanaz, mintha lassúnak mondanád :) Pontosabban, az FFT alapú módszer sokkal gyorsabb lesz, ha van egy jeled és a kernel nagyjából azonos méretű (ha a kernel sokkal kisebb, mint a bemenet, akkor az FFT valójában lassabb lehet, mint a közvetlen számítás). 26.07.2009
  • Ideális esetben az FFT algoritmus automatikusan gondoskodik a nulla kitöltésről a megfelelő méretre a legjobb sebesség érdekében. 17.08.2009
  • Ó, nem nulla paddingról beszélsz, hanem 5x5-ös kép és 2000x2000-es kép párosításáról. Miért nem tudja az algoritmus csak kitalálni, hogy az FFT hatékonyabb lenne-e, és megteheti a gyorsabb módszerrel? 21.08.2009
  • A scipy rendelkezik egy fftconvolve funkcióval docs .scipy.org/doc/scipy/reference/generated/ 01.09.2009

Válaszok:


1

Találtam scipy.signal.fftconvolve, amint arra magnus is rámutatott, de akkor még nem vettem észre, hogy ez n< /em> -dimenziós. Mivel beépített és megfelelő értékeket produkál, ideális megoldásnak tűnik.

A Példa a 2D konvolúcióra webhelyről:

In [1]: a = asarray([[ 1, 2, 3],
   ...:              [ 4, 5, 6],
   ...:              [ 7, 8, 9]])

In [2]: b = asarray([[-1,-2,-1],
   ...:              [ 0, 0, 0],
   ...:              [ 1, 2, 1]])

In [3]: scipy.signal.fftconvolve(a, b, mode = 'same')
Out[3]: 
array([[-13., -20., -17.],
       [-18., -24., -18.],
       [ 13.,  20.,  17.]])

Helyes! Az STSCI-verzió viszont némi plusz munkát igényel, hogy a határok helyesek legyenek?

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

(Az STSCI metódus fordítást is igényel, ami nem járt sikerrel (csak a nem python részeket kommentáltam), van néhány hiba, mint a ez és a bemenetek módosítása ([1, 2] lesz [[1, 2]]), stb. Így az elfogadott válaszomat a beépített fftconvolve() függvényre változtattam.)

A korreláció természetesen ugyanaz, mint a konvolúció, de egy megfordított bemenettel:

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

és a legújabb verzió felgyorsult a két méret belső használatával (majd felgyorsítottam, valódi FFT-vel valódi bevitel és 5 sima hossz használata 2 hatvány helyett :D ).

20.11.2009

2

nézd meg a scipy.signal.fftconvolve, signal.convolve és signal.correlate fájlokat (van egy signal.correlate2d, de úgy tűnik, hogy eltolt tömböt ad vissza, nem központosítva).

25.09.2009
  • Módosítottam erre az elfogadott válaszomat az alábbiak szerint: stackoverflow.com/questions/1100100/ 20.11.2009
  • Szia, csak egy nem kapcsolódó kérdés. Mennyi ideig tart a correlate2d futtatása 2048x2048 alakú 2-d tömbök esetén? 16.05.2019

  • 3

    Szerintem szeretnéd a scipy.stsci csomagot:

    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
    
    08.07.2009
  • Ezt én is láttam, de úgy tűnik, a SciPy-ben már nincs benne? ››› scipy.stsci.convolve Traceback importálás (legutóbbi hívás utolsó): Fájl ‹stdin›, 1. sor, ‹module› ImportError: Nincs convolve nevű modul 09.07.2009
  • Szia! Beillesztem a fenti prompt kimenetét. Mi a te verziód? 09.07.2009
  • Nyilvánvalóan valami nincs rendben: pastebin.com/mdd2bc6d Jó tudni, hogy létezik. 09.07.2009
  • Werid. Az ipython promptodból látom, hogy a python 2.6-ot használod. Van egy python 2.5.2. Fogalmam sincs, hogy a scipy-nek miért van verziónként eltérő kiadása. Talán egyszerűbb újratelepíteni a scipy-t, és megnézni, hogy a probléma továbbra is fennáll-e? 09.07.2009
  • A 2.6-os Windows gépemen működik, de más Ubuntu gépeken nem, tehát az Ubuntu csomagolási problémája lehet. bugs.launchpad.net/bugs/397217 13.07.2009
  • használhatja a correlate2d-t a scipy.signal-ból: többé-kevésbé ugyanazt a megvalósítási technikát használja, mint az stsci.convolve one (nincs FFT). A 2.6-os probléma fura - lehet, hogy valami distutils dologhoz kapcsolódik. 26.07.2009

  • 4

    A scipy-ben elvesztettem ennek a csomagnak a státuszát, de tudom, hogy a stsci_python kiadási csomag részeként a ndimage-et is felvesszük a felhasználók kényelme érdekében:

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

    vagy ki kell húznia a tárolóból, ha úgy tetszik:

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

    09.07.2009
  • A SciPy dokumentumok szerint azonban nem FFT alapú, ahogy a kérdésben említettem. scipy.org/SciPyPackages/Ndimage 15.08.2009
  • A convolve csomag a stsci_python tárolóból is elérhető. Tartalmazza a correlate2d függvényt, amely rendelkezik az általad is említett fft=True kapcsolóval. stsci.edu/svn/ssb/stsci_python/ stsci_python/trunk/convolve/lib/ 16.08.2009
  • Ó! Csak közvetlenül importálhatom a python-fájlt, ha eltávolítom a _correlate hivatkozást. Az FFT-korreláció mind Pythonban van. Most már működik. :) Kösz! 17.08.2009
  • Kiderült, hogy az stsci-t eltávolítják a SciPy-ből (ezért nem működik), és most a stsci_python verzió a mérvadó, ezért ezt teszem az elfogadott válasznak. 21.08.2009
  • Ezenkívül az 1-D konvolválás/korreláció nem FFT-gyorsítású. :( 01.09.2009

  • 5

    Írtam egy keresztkorrelációs/konvolúciós wrappert, amely gondoskodik a párnázásról és a nanókról, és egy egyszerű sima burkolóanyagot tartalmaz itt. Nem egy népszerű csomag, de a numpy-n (vagy fftw-n a gyorsabb fft-kért) kívül nincs függősége.

    Egy FFT sebességtesztelő kódot is implementáltam itt a> hátha valakit érdekel. Meglepő módon mutatja, hogy a numpy fft-ja gyorsabb, mint a scipy-é, legalábbis az én gépemen.

    SZERKESZTÉS: a kód áthelyezve az N-dimenziós verzióba ide

    10.12.2011

    6

    Vegye figyelembe, hogy létezik scipy.signal.oaconvolve a Scipy 1.4 óta, amely az átfedés-hozzáadás módszert használja .

    01.12.2019
    Új anyagok

    A rádiógomb ellenőrzött eseményének használata a jQueryben
    Ebben a cikkben látni fogjuk, hogyan kell dolgozni a jquery választógombbal ellenőrzött eseményeivel. A választógombok HTML gombok, amelyek segítenek kiválasztani egyetlen értéket egy csoportból...

    Körkörös függőségek megoldása terraformban adatforrásokkal – lépésről lépésre
    Mi az a körkörös függőségek Dolgozzunk egy egyszerű eseten, amikor az SQS-sor és az S3-vödör közötti körkörös függőség problémája van egy egymástól függő címkeérték miatt. provider..

    Miért érdemes elkezdeni a kódolást 2023-ban?
    01100011 01101111 01100100 01100101 — beep boop beep boop Világunk folyamatosan fejlődik a technológia körül, és naponta fejlesztenek új technológiákat a valós problémák megoldására. Amint..

    🎙 Random Noise #2  – Örökbefogadás és hit
    az analitika íratlan világának gondozása Szeretné, hogy ezek a frissítések a postaládájába kerüljenek? Iratkozzon fel itt . "Ha önvezető autókat gyártanak, akkor mi miért ne..

    A legrosszabb politika és prediktív modellek májátültetésre jelöltek számára az Egyesült Államokban
    A máj (vagy óangolul lifer) az emberi test legnehezebb belső szervére utal, amely csendesen működik a nap 24 órájában. Mit csinál a máj? 500 feladatot hajt végre a szervezet egészségének..

    5 webhely, amely 2022-ben fejleszti front-end fejlesztői készségeit
    Frontendmentor.io A tényleges projektek létrehozásával a Frontendmentor.io segítséget nyújt a front-end kódolási képességeinek fejlesztésében. A kódolást azután kezdheti meg, hogy..

    Mikor kell használni a Type-t az interfészhez képest a TypeScriptben?
    A TypeScript a JavaScript gépelt szuperkészlete, amely statikus gépelést ad a nyelvhez. Ez megkönnyíti a robusztus és karbantartható kód írását azáltal, hogy a hibákat a fordítási időben..


    © 2024 webhu.ru, WebHU - Programozási kérdések és válaszok