好的,我正在与转换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))

过滤numpy的与FFT,Python的<图像/ A>

上的如果您想出于某种原因做明确的,有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.sizearr2im.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)

许可以下: CC-BY-SA归因
不隶属于 StackOverflow
scroll top