如何将PIL图像转换成numpy的阵列?
-
23-08-2019 - |
题
好的,我正在与转换PIL图像对象来回一个numpy的阵列,所以我可以由除了PIL的PixelAccess
对象将允许像素变换做一些更快的像素周围玩弄。我已想出如何通过的方式放置在一个有用的3D numpy的阵列的像素信息:
pic = Image.open("foo.jpg")
pix = numpy.array(pic.getdata()).reshape(pic.size[0], pic.size[1], 3)
但我似乎无法弄清楚如何回到其装载到PIL对象我已经做了我所有的真棒变换后。我知道的 putdata()
方式,但不能完全似乎得到它的行为。
解决方案
您没有说究竟是如何putdata()
没有表现。我假设你正在做
>>> pic.putdata(a)
Traceback (most recent call last):
File "...blablabla.../PIL/Image.py", line 1185, in putdata
self.im.putdata(data, scale, offset)
SystemError: new style getargs format but argument is not a tuple
这是因为预计putdata
元组序列和你给它一个numpy的阵列。此
>>> data = list(tuple(pixel) for pixel in pix)
>>> pic.putdata(data)
将工作,但它是非常缓慢的。
作为PIL 1.1.6时,“正确”的方式对图像和numpy的转换之间阵列是简单地
>>> pix = numpy.array(pic)
虽然所得的阵列在不同的格式比你(3- d阵列或在这种情况下的行/列/ RGB)。
然后,你让你更改阵列后,你应该能够做到无论是pic.putdata(pix)
或者创建拥有Image.fromarray(pix)
一个新的形象。
其他提示
打开I
作为数组:
>>> I = numpy.asarray(PIL.Image.open('test.jpg'))
做一些东西到I
,然后,将其转换回图像:
>>> im = PIL.Image.fromarray(numpy.uint8(I))
上的如果您想出于某种原因做明确的,有pil2array()和array2pil()函数相关性系数-in.html”的rel = “noreferrer”>在此correlation.zip页。 我在Python 3.5使用枕头4.1.1(PIL的后继)。枕头和numpy的之间的转换是简单的。
from PIL import Image
import numpy as np
im = Image.open('1.jpg')
im2arr = np.array(im) # im2arr.shape: height x width x channel
arr2im = Image.fromarray(im2arr)
这需要注意到的一件事是枕式im
是列为主,而numpy的风格im2arr
是行优先。然而,功能Image.fromarray
已经考虑到这一点。也就是说,arr2im.size == im.size
和arr2im.mode == im.mode
在上面的例子。
处理所述变换numpy的阵列时要照顾HxWxC数据格式,例如别变换im2arr = np.rollaxis(im2arr, 2, 0)
或im2arr = np.transpose(im2arr, (2, 0, 1))
成CxHxW格式。
您需要将您的图像这种方式转换成numpy的数组:
import numpy
import PIL
img = PIL.Image.open("foo.jpg").convert("L")
imgarr = numpy.array(img)
在实例中,我使用:
import PIL
import numpy
from PIL import Image
def resize_image(numpy_array_image, new_height):
# convert nympy array image to PIL.Image
image = Image.fromarray(numpy.uint8(numpy_array_image))
old_width = float(image.size[0])
old_height = float(image.size[1])
ratio = float( new_height / old_height)
new_width = int(old_width * ratio)
image = image.resize((new_width, new_height), PIL.Image.ANTIALIAS)
# convert PIL.Image into nympy array back again
return array(image)
如果您的图像被存储在一个斑点格式(即在数据库中),可以使用通过Billal Begueradj所解释的相同的技术来图像从斑点转换为字节阵列。
在我的情况下,我需要我的图片,其中存储在BLOB列在一个数据库表:
def select_all_X_values(conn):
cur = conn.cursor()
cur.execute("SELECT ImageData from PiecesTable")
rows = cur.fetchall()
return rows
我然后创建了一个辅助函数来改变我的数据集成np.array:
X_dataset = select_all_X_values(conn)
imagesList = convertToByteIO(np.array(X_dataset))
def convertToByteIO(imagesArray):
"""
# Converts an array of images into an array of Bytes
"""
imagesList = []
for i in range(len(imagesArray)):
img = Image.open(BytesIO(imagesArray[i])).convert("RGB")
imagesList.insert(i, np.array(img))
return imagesList
在此之后,我能够使用的ByteArray在我的神经网络。
plt.imshow(imagesList[0])
def imshow(img):
img = img / 2 + 0.5 # unnormalize
npimg = img.numpy()
plt.imshow(np.transpose(npimg, (1, 2, 0)))
plt.show()
可以转换图像分成numpy的 通过压扁出特征后的图像解析成numpy的()函数(unnormalization)