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

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?

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

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

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 realice a lo largo de solo dos ejes:

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

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, por lo que el primer índice (digamos x ) se refiere al número de línea (por lo 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 cotidiano.

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.