478 Stimmen

Wie konvertiert man ein PIL-Bild in ein Numpy-Array?

Alright, ich bin herumspielen mit der Umwandlung eines PIL-Bild-Objekts hin und her zu einem Numpy-Array, so dass ich einige schnellere Pixel durch Pixel-Transformationen als PIL's tun können PixelAccess Objekt erlauben würde. Ich habe herausgefunden, wie man die Pixel-Informationen in einem nützlichen 3D-Numpy-Array mit Hilfe von:

pic = Image.open("foo.jpg")
pix = numpy.array(pic.getdata()).reshape(pic.size[0], pic.size[1], 3)

Aber ich kann nicht scheinen, um herauszufinden, wie man es zurück in die PIL-Objekt zu laden, nachdem ich alle meine awesome Transformationen getan haben. Ich bin mir bewusst, dass die putdata() Methode, aber ich kann sie nicht dazu bringen, sich richtig zu verhalten.

3voto

Uki D. Lucas Punkte 456

Das Beispiel, das ich heute verwendet habe:

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)

0voto

Charles Vogt Punkte 101

Wenn Ihr Bild in einem Blob-Format (d.h. in einer Datenbank) gespeichert ist, können Sie die von Billal Begueradj beschriebene Technik verwenden, um Ihr Bild von Blobs in ein Byte-Array zu konvertieren.

In meinem Fall brauchte ich meine Bilder, wo in einer Blob-Spalte in einer DB-Tabelle gespeichert:

def select_all_X_values(conn):
    cur = conn.cursor()
    cur.execute("SELECT ImageData from PiecesTable")    
    rows = cur.fetchall()    
    return rows

Ich habe dann eine Hilfsfunktion erstellt, um mein Dataset in np.array zu ändern:

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

Danach konnte ich die ByteArrays in meinem Neuronalen Netz verwenden.

plt.imshow(imagesList[0])

-4voto

Thiyagu Punkte 39
def imshow(img):
    img = img / 2 + 0.5     # unnormalize
    npimg = img.numpy()
    plt.imshow(np.transpose(npimg, (1, 2, 0)))
    plt.show()

Sie können das Bild in numpy umwandeln umwandeln, indem Sie das Bild in die Funktion numpy() parsen, nachdem Sie die Merkmale herausgefiltert haben (Unnormalisierung)

CodeJaeger.com

CodeJaeger ist eine Gemeinschaft für Programmierer, die täglich Hilfe erhalten..
Wir haben viele Inhalte, und Sie können auch Ihre eigenen Fragen stellen oder die Fragen anderer Leute lösen.

Powered by:

X