Saltar al contenido

python – matriz RGB de una imagen

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)
¡Haz clic para puntuar esta entrada!
(Votos: 0 Promedio: 0)



Utiliza Nuestro Buscador

Deja una respuesta

Tu dirección de correo electrónico no será publicada. Los campos obligatorios están marcados con *