簡體   English   中英

如何將 PIL 圖像轉換為 numpy 數組?

[英]How to convert a PIL Image into a numpy array?

好吧,我正在嘗試將 PIL 圖像對象來回轉換為 numpy 數組,這樣我就可以比 PIL 的PixelAccess對象允許的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))

來源: 使用 FFT、Python 過濾 numpy 圖像

如果您出於某種原因想明確地執行此操作,則在correlation.zip 中的此頁面上有使用getdata() 的pil2array() 和array2pil() 函數。

我在 Python 3.5 中使用 Pillow 4.1.1(PIL 的繼承者)。 Pillow 和 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)

需要注意的一件事是 Pillow 風格的im是列im2arr而 numpy 風格的im2arr是行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) 

Numpy to PIL轉換Numpy to PIL圖像並將PIL to Numpy轉換PIL to Numpy

import numpy as np
from PIL import Image

def pilToNumpy(img):
    return np.array(img)

def NumpyToPil(img):
    return Image.fromarray(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)

如果您的圖像以 Blob 格式存儲(即在數據庫中),您可以使用 Billal Begueradj 解釋的相同技術將您的圖像從 Blob 轉換為字節數組。

就我而言,我需要將圖像存儲在 db 表的 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

在此之后,我能夠在我的神經網絡中使用 byteArrays。

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

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM