python – matriz RGB de una imagen

Tomando una imagen como entrada, ¿cómo puedo obtener la matriz rgb correspondiente a ella? Revisé la función numpy.asarray. ¿Eso me da la matriz rgb o alguna otra matriz?

Tenga en cuenta que esta respuesta está desactualizada a partir de 2018; scipy ha desaprobado imread , y debes cambiar a imageio.imread . Ver este documento de transición sobre las diferencias entre los dos. El código a continuación debería funcionar sin cambios si solo importa la nueva biblioteca en lugar de la antigua, pero no la he probado.


La respuesta más simple es usar los envoltorios NumPy y SciPy alrededor de PIL. Hay un gran tutorial , pero la idea básica es:

 from scipy import misc arr = misc.imread('lena.png') # 640x480x3 array arr[20, 30] # 3-vector for a pixel arr[20, 30, 1] # green value for a pixel 

Para una imagen RGB de 640×480, esto le dará una matriz de uint8 de uint8 .

O simplemente puede abrir el archivo con PIL (o, mejor dicho, Almohada; si aún usa PIL, esto puede no funcionar o puede ser muy lento) y pasarlo directamente a NumPy:

 import numpy as np from PIL import Image img = Image.open('lena.png') arr = np.array(img) # 640x480x4 array arr[20, 30] # 4-vector, just like above 

Esto le dará una matriz de 640x480x4 de tipo uint8 (la cuarta es alfa; PIL siempre carga archivos PNG como RGBA, incluso si no tienen transparencia; consulte img.getbands() si no está seguro).

Si no desea usar NumPy, el tipo PixelArray PIL es una matriz más limitada:

 arr = img.load() arr[20, 30] # tuple of 4 ints 

Esto le proporciona una matriz de 4-tuplas RGBA PixelAccess 640×480.

O simplemente puede llamar a getpixel en la imagen:

 img.getpixel(20, 30) # tuple of 4 ints 

Tengo la sensación de que no estoy haciendo exactamente lo que quería, así que especifique si esto está totalmente mal. Podría abrir la imagen de esta manera y obtener una matriz de píxeles:

 import Image im = Image.open('Lenna.png') pixels = list(im.getdata()) 

Esto te dará una lista plana de datos RGB que parecen

 [(226, 137, 125), (226, 137, 125), (223, 137, 133), (223, 136, 128), (226, 138, 120), (226, 129, 116), (228, 138, 123), (227, 134, 124), (227, 140, 127), (225, 136, 119), (228, 135, 126), (225, 134, 121),... 

Ahora esto será todos los píxeles en una matriz plana, si desea una matriz bidimensional, entonces se necesitará algo de código adicional para eso. No estoy seguro si hay una función directa para ello en PIL.

También para agregar, si usted o alguien más está usando opencv.

  imgc=cv2.imread(file) 

o leer en escala de grises

  imgc=cv2.imread(file,0) 

Si va a hacer alguna comparación entre las imágenes, puede pensar en convertir la matriz de píxeles en histogtwigs para normalizar los datos.

  hist = np.histogram(img.flatten(),256,[0,256])[0] 

La línea anterior primero aplana la matriz de img para que pierda la dimensionalidad de su imagen. Luego produce bandejas de 0 a 256 (para la imagen en escala de grises) y agrega las cuentas del img a estas bandejas y las devuelve como hist, que luego se puede trazar. Por ejemplo, si el contenedor de 100 tiene un valor de 20, significa que 20 píxeles en su imagen tenían un valor de 100.

Espero que esto agregue otra posibilidad para pensar o para cualquier persona que quiera comenzar a trabajar en OpenCV.

Intenté imageio.imread y funcionó muy bien, pero un minuto más tarde me topé con una función en matplotlib que funcionaba exactamente igual, obteniendo un numpy n por m por 3 array:

 from matplotlib import pyplot as plot image = plt.imread(path)