Schnelle Kreuzkorrelationsmethode in Python

8

Ich habe kürzlich versucht, einen schnellen und effizienten Weg zu finden, Kreuzkorrelationsüberprüfungen zwischen zwei Arrays unter Verwendung der Python-Sprache durchzuführen. Nach einigem Lesen habe ich diese zwei Optionen gefunden:

  1. Die Methode NumPy.correlate() , die bei großen Arrays zu langsam ist.
  2. Die Methode cv.MatchTemplate() , die viel schneller zu sein scheint.

Aus offensichtlichen Gründen habe ich die zweite Option gewählt. Ich habe versucht, den folgenden Code auszuführen:

%Vor%

Obwohl dieser Code sehr einfach zu sein scheint, löst er den nächsten Fehler aus:

%Vor%

Nach ein paar Stunden frustrierender Versuche bin ich immer noch festgefahren! Hat jemand einen Vorschlag?

Übrigens, das ist meine Python-Ausgabe:

%Vor%

Danke euch allen!

    
Shlomi 07.09.2012, 19:03
quelle

2 Antworten

20

Sie werden wahrscheinlich nicht viel schneller als mit einer fft-basierten Korrelationsmethode kommen.

%Vor%

Jetzt für einen Zeitvergleich:

%Vor%

Wenn Sie mit einer zirkulären Korrelation umgehen können, können Sie die Kopie entfernen. Die Zeitdifferenz erhöht sich, wenn data_length zunimmt.

    
Henry Gomersall 07.09.2012, 19:58
quelle
3

Ich glaube, dass Ihr Code fehlschlägt, weil OpenCV Bilder als uint8 und nicht als float32-Format erwartet. Sie können die cv2 Python-Schnittstelle intuitiver verwenden (automatische Konvertierung zwischen NDarray- und CV-Bildformaten).

Wie für die Geschwindigkeit der Korrelation, können Sie versuchen, eine schnelle fft-Implementierung (FFTW hat einen Python-Wrapper: pypftw ).

    
Nicolas Barbey 10.09.2012 08:08
quelle