proyectos ejemplos python image-processing numpy scipy gdal

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.