python - ejemplos - django
Tabla de resoluciĆ³n de subidas en Python (5)
Cuando se reduce la resolución, la interpolación es lo incorrecto. Siempre use un enfoque agregado.
Utilizo block means para hacer esto, usando un "factor" para reducir la resolución.
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
Por ejemplo, una matriz de formas (100, 200) que utiliza un factor de 5 (bloques de 5x5) da como resultado un resultado de matriz (20, 40):
ar = np.random.rand(20000).reshape((100, 200))
block_mean(ar, 5).shape # (20, 40)
Tengo matrices numpy 2-D básicas y me gustaría "reducir la resolución" de ellas a una resolución más burda. ¿Hay un simple módulo numpy o scipy que pueda hacer esto fácilmente? También debería tener en cuenta que esta matriz se muestra geográficamente a través de módulos de mapa base.
MUESTRA:
Debido a que OP solo quiere una resolución de courser, pensé que compartiría mi camino para reducir el número de píxeles a la mitad en cada dimensión. Tomo la media de 2x2 bloques. Esto se puede aplicar varias veces para reducir por factores de 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]
Puede que esto no sea lo que estás buscando, pero pensé que lo mencionaría para completarlo.
Puede intentar instalar scikits.samplerate
( docs ), que es un contenedor de Python para libsamplerate. Proporciona buenos algoritmos de remuestreo de alta calidad, PERO, por lo que puedo ver, solo funciona en 1D. Es posible que pueda volver a muestrear su señal 2D primero a lo largo de un eje y luego a lo largo de otro, pero creo que, para empezar, podría contrarrestar los beneficios del remuestreo de alta calidad.
imresize y ndimage.interpolation.zoom parecen hacer lo que quieras
No he intentado antes, pero aquí es cómo he usado ndimage.interpolation.zoom
a = np.array(64).reshape(8,8)
a = ndimage.interpolation.zoom(a,.5) #decimate resolution
a es entonces una matriz de 4x4 con valores interpolados en ella
scikit-image
ha implementado una versión de trabajo de downsampling
aquí, aunque evitan llamarlo downsampling
para que no sea un downsampling en términos de DSP, si entiendo correctamente:
http://scikit-image.org/docs/dev/api/skimage.measure.html#skimage.measure.block_reduce
pero funciona muy bien, y es el único downsampler
que encontré en Python que puede tratar con np.nan
en la imagen. He bajado muestras de imágenes gigantescas con esto muy rápidamente.