Gaußsche Filterung eines Bildes mit Nan in Python

8

Aus einer Liste von 2D-Koordinaten und einer dritten Variablen (Geschwindigkeit) habe ich ein zweidimensionales nupy-Array erstellt, das den gesamten gesampelten Bereich abdeckt. Ich möchte ein Bild erstellen, in dem jedes Pixel die mittlere Geschwindigkeit der darin liegenden Punkte enthält. Danach filtere das Bild mit einem Gauss-Filter.

Das Problem ist, dass das Gebiet nicht einheitlich abgetastet wird. Daher habe ich mehrere Pixel ohne Informationen ( Nan ) in der Mitte des Bildes. Wenn ich versuche, das Array durch einen Gauss-Filter zu filtern, propagieren die Nan das gesamte Bild.

Ich muss dieses Bild filtern, aber alle Pixel ohne Informationen ablehnen. Mit anderen Worten, wenn ein Pixel keine Informationen enthält, sollte es für die Filterung nicht berücksichtigt werden.

Hier ist ein Beispiel für meinen Code zum Mitteln:

%Vor%

BEARBEITEN:

Im Internet surfen Ich habe diese Frage im Jahr 2013 beendet. Die Lösung dieses Problems finden Sie in der Astropiebibliothek:

Ссылка

Die Faltung der Astropie ersetzt die NaN-Pixel durch eine kernelgewichtete Interpolation von ihren Nachbarn.

Danke Leute !!

    
user2761243 09.09.2013, 11:46
quelle

2 Antworten

10

in Worten:

Ein Gauß-Filter, der NaNs in einem gegebenen Array U ignoriert, kann leicht durch Anwenden eines Gauß-Standardfilters auf zwei Hilfsarrays V und W und indem Sie das Verhältnis der beiden nehmen, um das Ergebnis Z zu erhalten.

Hier ist V eine Kopie des ursprünglichen U , wobei NaNs durch Nullen ersetzt werden und W ein Array von Einsen mit Nullen ist, die die Positionen angeben von NaNs im ursprünglichen U .

Die Idee ist, dass das Ersetzen der NaNs durch Nullen einen Fehler in der gefilterten Anordnung einführt, der jedoch kompensiert werden kann, indem das gleiche Gauß'sche Filter auf eine andere Hilfsanordnung angewendet wird und beide kombiniert werden.

in Python:

%Vor%

in Zahlen:

Hier werden die Koeffizienten des Gaußschen Filters zu Demonstrationszwecken auf [0.25,0,50,0,25] gesetzt, und sie addieren sich zu einem 0,25 + 0,50 + 0,25 = 1, ohne dass die Allgemeinheit verloren geht.

Nach dem Ersetzen der NaNs durch Nullen und Anwenden des Gauß-Filters (vgl. unten VV) ist klar, dass die Nullen einen Fehler einführen, dh aufgrund der "fehlenden" Daten werden die Koeffizienten 0,25 + 0,50 = 0,75 nicht summiert zu einem mehr und unterschätzen daher den "wahren" Wert.

Dies kann jedoch kompensiert werden, indem das zweite Hilfsarray (vgl. WW unten) verwendet wird, das nach der Filterung mit der gleichen Gauß-Funktion nur die Summe der Koeffizienten enthält.

Die Division der beiden gefilterten Hilfsarrays skaliert die Koeffizienten daher so um, dass sie zu Eins addiert werden, während die NaN-Positionen ignoriert werden.

%Vor%     
David 30.03.2016 11:21
quelle
-4

Am einfachsten wäre es, nan s über nan_to_num in Nullen umzuwandeln. . Ob dies sinnvoll ist oder nicht, ist eine separate Frage.

    
ev-br 09.09.2013 12:41
quelle