Muy bien, estoy jugando con la conversión de un objeto de imagen PIL de ida y vuelta a una matriz numpy para poder hacer algunas transformaciones de píxel a píxel más rápidas de PixelAccess
lo que permitiría el objeto de PIL . He descubierto cómo colocar la información de píxeles en una útil matriz numpy 3D mediante:
pic = Image.open("foo.jpg")
pix = numpy.array(pic.getdata()).reshape(pic.size[0], pic.size[1], 3)
Pero parece que no puedo entender cómo cargarlo de nuevo en el objeto PIL después de haber realizado todas mis transformaciones increíbles. Soy consciente del putdata()
método, pero parece que no puedo lograr que se comporte.
pic.size[0]
ypic.size[1]
debe intercambiarse (es decirreshape(pic.size[1], pic.size[0], 3)
), ya quesize
eswidth x height
ox * y
, mientras que el ordenamiento matricial esrows x columns
.Respuestas:
No estás diciendo cómo exactamente
putdata()
no se está comportando. Supongo que lo estás haciendoEsto se debe a que
putdata
espera una secuencia de tuplas y le está dando una matriz numpy. Estafuncionará pero es muy lento.
A partir de PIL 1.1.6, la forma "adecuada" de convertir entre imágenes y matrices numpy es simplemente
aunque la matriz resultante tiene un formato diferente al tuyo (matriz 3-d o filas / columnas / rgb en este caso).
Luego, después de realizar los cambios en la matriz, debería poder hacer
pic.putdata(pix)
o crear una nueva imagen conImage.fromarray(pix)
.fuente
Image.fromarray
no aparece en la documentación de PIL (!) Así que nunca lo habría encontrado si no fuera por esto.numpy.asarray(pic)
como la forma "adecuada" de convertir, nonumpy.array(pic)
. Según esta respuestaarray
, hará una copia mientrasasarray
que no lo hará (pero luego elasarray
resultado será de solo lectura).Abrir
I
como una matriz:Haga algunas cosas para
I
luego convertirlo nuevamente a una imagen:Filtra imágenes numpy con FFT, Python
Si desea hacerlo explícitamente por alguna razón, hay funciones pil2array () y array2pil () que usan getdata () en esta página en correlation.zip.
fuente
import Image
primero? ¿Tienes PIL instalado?uint8
necesaria la conversión?numpy.asarray(Image.open(filename))
parece funcionar para imágenes .jpg pero no para .png. El resultado se muestra comoarray(<PngImagePlugin.PngImageFile image mode=LA size=500x500 at 0x3468198>, dtype=object)
. Parece que no hay métodos obviamente nombrados delPngImagePlugin.PngImageFile
objeto para resolver esto. Supongo que debería hacer esto como una nueva pregunta, pero es muy relevante para este hilo. ¿Alguien entiende lo que está pasando aquí?getdata()
devuelve una secuencia como objeto ( pillow.readthedocs.io/en/3.4.x/reference/… ), pero una imagen de almohada implementa la__array_interface__
quenumpy
puede usar para acceder a los bytes sin procesar de una imagen sin tener que pasar por un iterador (consulte github.com/python-pillow/Pillow/blob/… y docs.scipy.org/doc/numpy/reference/arrays.interface.html ). Incluso puedes usarnumpy.array(PIL.Image.open('test.jpg'))
Estoy usando Pillow 4.1.1 (el sucesor de PIL) en Python 3.5. La conversión entre Pillow y numpy es sencilla.
Una cosa que debe
im
tenerse en cuenta es que el estilo Pillow es de columna principal mientras que el estilo numpyim2arr
es de fila mayor. Sin embargo, la funciónImage.fromarray
ya tiene esto en cuenta. Es decir,arr2im.size == im.size
yarr2im.mode == im.mode
en el ejemplo anterior.Deberíamos ocuparnos del formato de datos HxWxC al procesar las matrices numpy transformadas, por ejemplo, hacer la transformación
im2arr = np.rollaxis(im2arr, 2, 0)
oim2arr = np.transpose(im2arr, (2, 0, 1))
en formato CxHxW.fuente
np.flipud
reparación. Aunque mi imagen PIL fue creada desde cero usandoImageDraw.Draw
. Creo que hay que tener cuidado de dónde viene el origen de sus coordenadas.Necesita convertir su imagen en una matriz numpy de esta manera:
fuente
.convert("L")
por.convert("RGB")
El ejemplo que he usado hoy:
fuente
Si su imagen se almacena en un formato Blob (es decir, en una base de datos), puede usar la misma técnica explicada por Billal Begueradj para convertir su imagen de Blobs en una matriz de bytes.
En mi caso, necesitaba mis imágenes almacenadas en una columna de blob en una tabla db:
Luego creé una función auxiliar para cambiar mi conjunto de datos a np.array:
Después de esto, pude usar byteArrays en mi red neuronal.
fuente
Convertir
Numpy to PIL
imagen yPIL to Numpy
fuente
Puede transformar la imagen en numpy analizando la imagen en función numpy () después de eliminar las características (sin normalización)
fuente