pil from array python arrays numpy python-imaging-library pillow

from - pil image python



La conversión entre el objeto Pillow Image y la matriz numpy cambia la dimensión (3)

Estoy usando Pillow and numpy, pero tengo un problema con la conversión entre el objeto Pillow Image y la matriz numpy.

Cuando ejecuto el siguiente código, el resultado es extraño.

im = Image.open(os.path.join(self.img_path, ifname)) print im.size in_data = np.asarray(im, dtype=np.uint8) print in_data.shape

el resultado es

(1024, 768) (768, 1024)

¿Por qué se cambia la dimensión?


En realidad, esto se debe a que la mayoría de las bibliotecas de imágenes le ofrecen imágenes que se transpozan en comparación con las matrices numpy. esto es (creo) porque escribe archivos de imagen línea por línea, de modo que el primer índice (digamos x ) se refiere al número de línea (de modo que x es el eje vertical) y el segundo índice ( y ) se refiere al píxel posterior en línea (entonces y es el eje horizontal), que está en contra de nuestro sentido de coordenadas cotidianas.

Si quieres manejarlo correctamente necesitas recordar escribir:

image = library.LoadImage(path) array = (library.FromImageToNumpyArray(image)).T

y consecuentemente:

image = library.FromNumpyArrayToImage(array.T) library.WriteImage(image, path)

Que funciona también para imágenes en 3D. Pero no estoy prometiendo que este sea el caso de TODAS las bibliotecas de imágenes, solo con las que he trabajado.


Si tu imagen es en escala de grises, haz:

in_data = in_data.T

pero si está trabajando con imágenes rbg, desea asegurarse de que su operación de transposición se realiza a lo largo de solo dos ejes:

in_data = np.transpose(in_data, (1,0,2))


tal vez sea de columna principal mientras que las matrices en numpy son de fila principal

do in_data = in_data.T para transponer la matriz de python

Probablemente debería verificar in_data con la matplotlib de imshow para asegurarse de que la imagen se vea bien.

Pero, ¿sabe que matplotlib viene con sus propias funciones de carga que le dan una gran cantidad de arreglos directamente? Consulte: http://matplotlib.org/users/image_tutorial.html