Solución:
Tenga en cuenta que esta respuesta está desactualizada a partir de 2018; scipy
ha desaprobado imread
, y deberías cambiar a imageio.imread
. Consulte este documento de transición sobre las diferencias entre los dos. El siguiente código debería funcionar sin cambios si solo importa la nueva biblioteca en lugar de la anterior, pero no la he probado.
La respuesta más simple es usar las envolturas 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 640x480x3 uint8
.
O simplemente puede abrir el archivo con PIL (o, mejor dicho, Pillow; si todavía está usando 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 tipo 640x480x4 uint8
(el cuarto es alfa; PIL siempre carga archivos PNG como RGBA, incluso si no tienen transparencia; consulte img.getbands()
si no está seguro).
Si no desea utilizar NumPy en absoluto, el propio PIL PixelArray
type es una matriz más limitada:
arr = img.load()
arr[20, 30] # tuple of 4 ints
Esto le da un 640×480 PixelAccess
matriz de 4 tuplas RGBA.
O simplemente puedes llamar 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ías aquí, así que especifica 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 le dará una lista plana de datos RGB que se parece a
[(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, estos serán todos los píxeles en una matriz plana, si desea una matriz bidimensional, se necesitará un código adicional para eso. No estoy seguro de si existe una función directa para ello en PIL.
Lo intenté imageio.imread
y funcionó muy bien, pero un minuto después tropecé con una función en matplotlib
que funcionó exactamente igual, obteniendo un numpy
n por m por 3 matriz:
from matplotlib import pyplot as plt
image = plt.imread(path)