2013-09-06 8 views
20

Ich habe grundlegende 2-D-numpy-Arrays und ich möchte sie auf eine gröbere Auflösung "Downsample". Gibt es ein einfaches numpy oder scipy Modul, das das leicht machen kann? Ich sollte auch beachten, dass dieses Array geografisch über Grundkartenmodule angezeigt wird.Downsample-Array in Python

BEISPIEL: enter image description here

Antwort

3

imresize und ndimage.interpolation.zoom schauen, wie sie das tun, was Sie wollen

Ich habe nicht imresize vor versucht, aber hier ist, wie ich verwendet habe ndimage.interpolation.zoom

a = np.array(64).reshape(8,8) 
a = ndimage.interpolation.zoom(a,.5) #decimate resolution 

a ist dann eine 4x4-Matrix mit interpolierten Werten darin

+0

ist hier ein Code-Schnipsel: 'findiff = scipy.misc.imresize (diff, 30., interp = 'bilinear', mode = None) frefcobj = m.pcolormesh (x, y, findiff, schattierung = 'flach', vmin = -15, vmax = 15, cmap = cmap, zorder = 1) colbar = m.farbleiste (frefcobj, "bottom", size = "4%", pad = "5%", extend = 'beide', ticks = Intervalle) ' diff ist ein Array von 699x699. Scheint nicht die Aufgabe zu erfüllen. – wuffwuff

+0

Ich habe noch nicht versucht, impresize, aber ich habe ein Snippet mit Zoom hinzugefügt. Ist das nicht wonach Sie suchen?Ich kann imresize im Moment nicht testen, weil ich eine ältere Version von scipy habe, die es nicht zu enthalten scheint – Hammer

+0

Interessant. Es scheint nicht so zu sein, als ob ich nach etwas suche. Stattdessen wurde das Diff-Array genommen und im Grundkartenfenster mehrfach geplottet. Ich denke, ich brauche eine Art Aggregation oder Auflösung von Techniken. Vielen Dank für Ihre Anregungen. – wuffwuff

1

T Das ist vielleicht nicht das, wonach Sie suchen, aber ich dachte, ich würde es aus Gründen der Vollständigkeit erwähnen.

Sie könnten versuchen, scikits.samplerate (docs) zu installieren, das ist ein Python-Wrapper für libsamplerate. Es bietet schöne, qualitativ hochwertige Resampling-Algorithmen - ABER soweit ich das beurteilen kann, funktioniert es nur in 1D. Sie könnten Ihr 2D-Signal zunächst entlang einer Achse und dann entlang einer anderen Achse neu berechnen, aber ich denke, dass dies den Vorteilen einer qualitativ hochwertigen Neuberechnung entgegenwirken könnte.

+1

Ja, das wird in dieser Situation nicht funktionieren, aber danke für die Eingabe. Ich brauche etwas, das räumlich aggregieren kann. – wuffwuff

9

Beim Downsampling ist Interpolation das Falsche. Verwenden Sie immer einen aggregierten Ansatz.

Ich benutze Blockmittel, um dies zu tun, mit einem "Faktor", um die Auflösung zu reduzieren.

import numpy as np 
from scipy import ndimage 

def block_mean(ar, fact): 
    assert isinstance(fact, int), type(fact) 
    sx, sy = ar.shape 
    X, Y = np.ogrid[0:sx, 0:sy] 
    regions = sy/fact * (X/fact) + Y/fact 
    res = ndimage.mean(ar, labels=regions, index=np.arange(regions.max() + 1)) 
    res.shape = (sx/fact, sy/fact) 
    return res 

Eg, A (100, 200) Formanordnung einen Faktor 5 (5x5 Blöcke) zu einer (20, 40) -Anordnung Ergebnis mit:

ar = np.random.rand(20000).reshape((100, 200)) 
block_mean(ar, 5).shape # (20, 40) 
+1

Danke, Mike. Ich denke, Ihre Lösung ist mehr von dem, wonach ich suche. Wenn ich deinen Code anwende, erhalte ich einen Fehler wegen der fehlenden Arraygröße: 'Datei" diffplot.py ", Zeile 38, in block_mean res.shape = (sx/Tatsache, sy/Tatsache) ValueError: Gesamtgröße des neuen Arrays muss unverändert sein. – wuffwuff

+0

Das obige Problem war auf die Notwendigkeit zurückzuführen, dass der Faktor gleichmäßig in die ursprüngliche Array-Form aufteilbar ist. Diese Funktion liefert jedoch immer noch die falschen Ergebnisse. Interessant. Es scheint nicht so zu sein, als ob ich nach etwas suche. Stattdessen wurde das Diff-Array genommen und im Grundkartenfenster mehrfach geplottet. Ich denke, ich brauche eine Art Aggregation oder Auflösung von Techniken. Vielen Dank für Ihre Anregungen. – wuffwuff

+0

Hallo Mike, würde es dir etwas ausmachen zu erklären, warum Interpolation ein schlechter Weg zum Downsampling ist? Wenn Interpolation schlecht ist, gibt es eine nette Möglichkeit, Fälle zu behandeln, in denen die Bilddimensionen nicht durch die gewünschte Blockgröße teilbar sind? –

11

scikit-image eine funktionierende Version implementiert hier von downsampling, obwohl sie scheuen, es ruft downsampling es kein Downsampling in Bezug auf die DSP zu sein, wenn ich das richtig verstehe:

http://scikit-image.org/docs/dev/api/skimage.measure.html#skimage.measure.block_reduce

aber es funktioniert sehr gut, und es ist das einzige downsampler, das ich in Python gefunden habe, die mit np.nan im Bild umgehen kann. Ich habe damit sehr schnell riesige Bilder heruntergerechnet.

1

Da das OP nur eine bessere Auflösung haben möchte, dachte ich, ich würde meinen Weg teilen, die Anzahl der Pixel in jeder Dimension um die Hälfte zu reduzieren. Ich nehme den Mittelwert von 2x2 Blöcken. Dies kann mehrfach angewendet werden, um Faktoren zu reduzieren, von 2.

from scipy.ndimage import covolve 
array_downsampled = convolve(array, np.array([[0.25,0.25],[0.25,0.25]]))[:array.shape[0]:2,:array.shape[1]:2]