Updates dieser Seite:
In diesem Kapitel lernen wir einen Weg, um Bilder in Python auf Pixelebene zu verarbeiten, so dass wir z.B. Konvolutionen ausprobieren können.
Wir verwenden hier die Python-Bibliothek Pillow, um Bilder zu speichern und zu verarbeiten. Pillow ist das Nachfolgeprojekt der Python Image Library (PIL). Es wird aber immer noch die Abkürzung PIL im Code verwendet.
Siehe auch:
Um ein Bild aus dem Internet zu beziehen, benötigen wir außerdem BytesIO und requests.
Wir wandeln die Daten gleich in einem NumPy-Array um, damit wir damit in Keras arbeiten können. Sie sehen, dass es sich um ein Bild der Größe 600x450 mit 3 Kanälen (R, G, B) handelt.
from PIL import Image
from io import BytesIO
import numpy as np
import requests
url = "https://upload.wikimedia.org/wikipedia/commons/thumb/3/3f/Edward_Snowden_2013-10-9_%281%29_%28cropped%29.jpg/450px-Edward_Snowden_2013-10-9_%281%29_%28cropped%29.jpg"
response = requests.get(url)
img = Image.open(BytesIO(response.content))
img.load
idat = np.asarray(img)
print("Shape:", idat.shape)
idat[:2]# Testausgabe
Wir schauen uns das Image-Objekt an.
print(img)
img.mode
img.size
Im Package matplotlib gibt es die Funktion imshow (image show), um Bilder darzustellen.
from matplotlib.pyplot import imshow
imshow(img)
Tatsächlich kann man das auch so ausgeben:
img
Unsere RGB-Daten liegen als 3-dimensionaler Tensor vor. Wenn wir z.B. die Position (0, 0) betrachten, bekommen wir die drei Farbkanäle (RGB):
idat[0,0]
Um die rote Farbe zu löschen, können wir einfach die erste Zahl auf Null setzen.
Um ein Graustufenbild zu bekommen, können wir z.B. den Durchschnitt der drei Zahlen bilden:
idat[0,0].mean()
Wir möchten jetzt neue Varianten herstellen. Für unser Bild ohne Rot kopieren wir einfach den NumPy-Array:
idat_noR = np.copy(idat)
Für unser Graustufenbild brauchen wir einen Tensor, der nur 2-dimensional ist. Wir stellen also einen Nulltensor mit den Dimensionen des Originalbilds her (600 x 450).
idat_grey = np.zeros((idat.shape[0], idat.shape[1]))
Jetzt durchlaufen wir alle Pixel des Originals und befüllen unsere beiden neuen Arrays:
for i in range(idat.shape[0]):
for j in range(idat.shape[1]):
idat_noR[i,j,0] = 0.0
idat_grey[i,j] = idat[i,j].mean()
Mit Pillow erzeugen wir aus den Arrays entsprechende Bildobjekte:
img_noR = Image.fromarray(idat_noR, 'RGB')
img_grey = Image.fromarray(idat_grey)
Wir schauen uns das mit imshow an. Zunächst das Graustufenbild:
imshow(img_grey)
Jetzt das Bild, wo wir den Rotwert auf Null gesetzt hatten.
imshow(img_noR)
Natürlich müssen Sie immer wieder mal die Bildgröße ändern oder das Bild zuschneiden. Man findet solche Standardoperationen unter https://pillow.readthedocs.io/en/5.3.x/reference/Image.html
Wir schauen uns die beiden erwähnten Operationen jetzt an.
img_small = img.resize((int(img.size[0]/2), int(img.size[1]/2)))
Man sieht den Größenunterschied bei dieser Ausgabe lediglich an den Achsenbeschriftungen.
imshow(img_small)