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):
Dies ist der Code mit numpy, varianceMatrix ist die Ausgabe
%Vor%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 ???
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.):
Ergebnis stimmt mit dem von ndimage.generic_filter()
überein:
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.