2017-01-26 1 views
0

Ich habe ein Array, so etwas wie:Upsample und interpolieren eine NumPy Array

array = np.arange(0,4,1).reshape(2,2) 

> [[0 1 
    2 3]] 

I mit höherer Abtastung dieses Array sowie interpoliert die resultierenden Werte für beide wollen. Ich weiß, dass ein guter Weg, um ein Array Upsampling unter Verwendung ist:

array = eratemp[0].repeat(2, axis = 0).repeat(2, axis = 1) 
[[0 0 1 1] 
[0 0 1 1] 
[2 2 3 3] 
[2 2 3 3]] 

aber ich kann nicht einen Weg finden, um die Werte zu interpolieren, die ‚blockartig‘ Natur zwischen jedem 2x2 Abschnitt des Arrays zu entfernen.

Ich möchte etwas wie folgt aus:

[[0 0.4 1 1.1] 
[1 0.8 1 2.1] 
[2 2.3 3 3.1] 
[2.1 2.3 3.1 3.2]] 

So etwas wie dieses (Hinweis: diese werden nicht die genauen Zahlen). Ich verstehe, dass es nicht möglich ist, dieses bestimmte 2D-Gitter zu interpolieren, aber mit dem ersten Gitter in meiner Antwort sollte eine Interpolation während des Upsampling-Prozesses möglich sein, da Sie die Anzahl der Pixel erhöhen und somit die Lücken füllen können ".

Ich bin nicht zu sehr auf die Art der Interpolation, vorausgesetzt, die endgültige Ausgabe ist eine geglättete Oberfläche! Ich habe versucht, die scipy.interp2d Methode zu verwenden, aber ohne Erfolg, wäre dankbar, wenn jemand ihre Weisheit teilen könnte!

+0

Möchten Sie eine zweidimensionale Interpolation durchführen?Ich sehe nicht, wie das funktionieren würde. Wenn Sie eine Achse interpolieren, unterbrechen Sie die Interpolation der anderen. Recht? – tnknepp

+0

"Sie bekommen die Idee!" - Entschuldigung, ich verstehe es nicht ganz. Könnten Sie den Rest des 4x4-Arrays, das Sie erwarten, ausfüllen? –

+0

Danke für Ihre Kommentare. Ich habe den Rest des Gitters ausgefüllt, um eine Vorstellung von meinem gewünschten Ergebnis zu geben. Ich verstehe, dass das Interpolieren des zweiten 2D-Gitters in meiner Antwort problematisch sein kann, aber es muss eine Möglichkeit geben, das erste Gitter zu interpolieren, während der Upsampling-Prozess stattfindet. –

Antwort

1

Sie können SciPy interp2d für die Interpolation verwenden, Sie finden die Dokumentation here.

from scipy import interpolate 
x = np.array(range(2)) 
y = np.array(range(2)) 
a = np.array([[0, 1], [2, 3]]) 
xx, yy = np.meshgrid(x, y) 
f = interpolate.interp2d(x, y, a, kind='linear') 

xnew = np.linspace(0, 2, 4) 
ynew = np.linspace(0, 2, 4) 
znew = f(xnew, ynew) 

Wenn Sie znew ausdrucken sollte wie folgt aussehen:

Ich habe das Beispiel aus der Dokumentation ein wenig modifiziert

array([[ 0.  , 0.66666667, 1.  , 1.  ], 
     [ 1.33333333, 2.  , 2.33333333, 2.33333333], 
     [ 2.  , 2.66666667, 3.  , 3.  ], 
     [ 2.  , 2.66666667, 3.  , 3.  ]]) 
+0

+1 Danke! Gute Verwendung einer vorhandenen Funktion, um sowohl meine Upsampling- als auch Interpolationsschritte auf einmal auszuführen! –

0

würde ich scipy.misc.imresize:

array = np.arange(0,4,1).reshape(2,2) 
from skimage.transform import resize 
out = scipy.misc.imresize(array, 2.0) 

Die 2.0 zeigt an, dass der Ausgang doppelt so groß sein soll Dimensionen der Eingabe. Sie können alternativ einen int oder einen tuple angeben, um einen Prozentsatz der ursprünglichen Abmessungen oder nur die neuen Abmessungen selbst anzugeben.

Dies ist sehr einfach zu bedienen, aber es ist ein zusätzlicher Schritt, weil imresize neu skaliert alles, damit Ihr Maximalwert wird 255 und Ihr min wird 0. (Und es ändert den Datentyp np.unit8.) Sie müssen möglicherweise etwas tun wie:

out = out.astype(array.dtype)/255 * (np.max(array) - np.min(array)) + np.min(array) 

die am Ausgang Werfen wir einen Blick:

>>> out.round(2) 
array([[0. , 0.25, 0.75, 1. ], 
     [0.51, 0.75, 1.26, 1.51], 
     [1.51, 1.75, 2.26, 2.51], 
     [2. , 2.25, 2.75, 3. ]]) 

imresize mit deprecation Warnung kommt und Ersatz, aber:

VernachlässigungWarnung: imresize ist veraltet! imresize ist in SciPy 1.0.0 veraltet und wird in 1.2.0 entfernt. Verwenden Sie stattdessen skimage.transform.resize.

Verwandte Themen