Berechnung der Varianz eines Bild-Pythons effizient

8

Ich arbeite an einem Projekt, bei dem die Varianz eines Bildes benötigt wird. Zurzeit nehme ich zwei Ansätze (beide funktionieren, sind aber sehr langsam):

  1. Berechnung der Varianz für jeden einzelnen Pixel:

Dies ist der Code mit numpy, varianceMatrix ist die Ausgabe

%Vor%
  1. Verwenden einer vorhandenen scipy-Funktion:

Dies ist die Scipy-Funktion:

%Vor%

Die scipy-Funktion ist schneller, aber nicht so sehr. Ich suche nach einer besseren Alternative, um die Varianz zu berechnen.

Irgendwelche Ideen ???

    
est.tenorio 08.03.2015, 20:03
quelle

3 Antworten

5

Hier eine schnelle Lösung mit OpenCV:

%Vor%

Auf meinem Rechner und für das folgende Beispiel ist winVar() 2915 mal schneller als ndimage.generic_filter() und 10,8 mal schneller als sliding_img_var() (siehe Antwort von pv.):

%Vor%

Ergebnis stimmt mit dem von ndimage.generic_filter() überein:

%Vor%     
Ulrich Stern 28.03.2016 16:10
quelle
1

Sie können einen bekannten Sliding Window Stride Trick um die Berechnung zu beschleunigen. Es fügt zwei "virtuelle Dimensionen" am Ende des Arrays hinzu, ohne die Daten zu kopieren, und berechnet dann die Varianz darüber.

Beachten Sie, dass im[j-w:j+w, ..] in Ihrem Code über die Indizes j-w,j-w+1,...,j+w-1 hinausgeht, der letzte ist exklusiv, was Sie vielleicht nicht gemeint haben. Außerdem sind die Varianzen größer als der Uint8-Bereich, so dass Sie mit Integer-Wraparound enden.

%Vor%     
pv. 09.03.2015 18:36
quelle
0

Wenn die Methode, die ndimage.generic_filter verwendet, nicht schnell genug ist, können Sie Ihre eigene optimierte Implementierung für die Varianzberechnung in Cython schreiben.

    
rth 09.03.2015 16:20
quelle

Tags und Links