Note that this answer is outdated as of 2018; scipy
has deprecated imread
, and you should switch to imageio.imread
. See this transition doc about differences between the two. The code below should work with no changes if you just import the new library in place of the old, but I haven’t tested it.
The simplest answer is to use the NumPy and SciPy wrappers around PIL. There's a great tutorial, but the basic idea is:
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
For a 640x480 RGB image, this will give you a 640x480x3 array of uint8
.
Or you can just open the file with PIL (or, rather, Pillow; if you're still using PIL, this may not work, or may be very slow) and pass it straight to 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
This will give you a 640x480x4 array of type uint8
(the 4th is alpha; PIL always loads PNG files as RGBA, even if they have no transparency; see img.getbands()
if you're every unsure).
If you don't want to use NumPy at all, PIL's own PixelArray
type is a more limited array:
arr = img.load()
arr[20, 30] # tuple of 4 ints
This gives you a 640x480 PixelAccess
array?of RGBA 4-tuples.
Or you can just call getpixel
on the image:
img.getpixel(20, 30) # tuple of 4 ints
与恶龙缠斗过久,自身亦成为恶龙;凝视深渊过久,深渊将回以凝视…