我有一个.jpg图像,我想转换为Python数组,因为我实现了处理普通Python数组的处理例程。
似乎PIL图像支持转换为numpy数组,并且根据我写的文档:
from PIL import Image
im = Image.open("D:\Prototype\Bikesgray.jpg")
im.show()
print(list(np.asarray(im)))
这将返回一个numpy数组列表。另外,我尝试了
list([list(x) for x in np.asarray(im)])
因为失败而没有返回任何内容。
如何从PIL转换为数组,或者只是从numpy数组转换为Python数组?
答案 0 :(得分:17)
我强烈建议您使用tobytes
对象的Image
功能。经过一些时间检查后,效率会更高。
def jpg_image_to_array(image_path):
"""
Loads JPEG image into 3D Numpy array of shape
(width, height, channels)
"""
with Image.open(image_path) as image:
im_arr = np.fromstring(image.tobytes(), dtype=np.uint8)
im_arr = im_arr.reshape((image.size[1], image.size[0], 3))
return im_arr
我在笔记本电脑上播放的时间显示
In [76]: %timeit np.fromstring(im.tobytes(), dtype=np.uint8)
1000 loops, best of 3: 230 µs per loop
In [77]: %timeit np.array(im.getdata(), dtype=np.uint8)
10 loops, best of 3: 114 ms per loop
```
答案 1 :(得分:12)
我认为你在寻找的是:
list(im.getdata())
或者,如果图像太大而无法完全加载到内存中,那么就像这样:
for pixel in iter(im.getdata()):
print pixel
的GetData
im.getdata()=>序列
将图像的内容作为包含像素的序列对象返回 值。序列对象被展平,因此第一行的值 在零行的值之后直接跟随,依此类推。
请注意,此方法返回的序列对象是内部的 PIL数据类型,仅支持某些序列操作, 包括迭代和基本序列访问。将其转换为 普通序列(例如用于打印),使用列表(im.getdata())。
答案 2 :(得分:5)
import Image
import numpy
def image2pixelarray(filepath):
"""
Parameters
----------
filepath : str
Path to an image file
Returns
-------
list
A list of lists which make it simple to access the greyscale value by
im[y][x]
"""
im = Image.open(filepath).convert('L')
(width, height) = im.size
greyscale_map = list(im.getdata())
greyscale_map = numpy.array(greyscale_map)
greyscale_map = greyscale_map.reshape((height, width))
return greyscale_map
答案 3 :(得分:2)
我使用numpy.fromiter来反转8灰度位图,但没有副作用的迹象
import Image
import numpy as np
im = Image.load('foo.jpg')
im = im.convert('L')
arr = np.fromiter(iter(im.getdata()), np.uint8)
arr.resize(im.height, im.width)
arr ^= 0xFF # invert
inverted_im = Image.fromarray(arr, mode='L')
inverted_im.show()