Hauptziele:
Links:
Ein Bild besteht aus lauter Pixel. Jedes Pixel wird durch vier Werte festgelegt: $$[R,G,B,A]$$ Also: Rot, Grün, Blau und Alpha. Jeder dieser Werte liegt im Bereich $0$ bis und mit $255$. Alpha gibt die Transparenz des Pixels an.
Ein Pixel, welches Rot in voller Stärke leuchten soll, wird also durch $[255,0,0,255]$ beschrieben.
Nicht alle Bildformate unterstützen Transparenz, das populäre JPEG-Format (*.jpg
) hat beispielsweise keinen Alpha-Kanal.
Im folgenden wird der Alpha-Kanal darum teilweise weggelassen, dann sind die Pixel nicht transparent, ein Bildpunkt besteht nur aus drei statt vier Werten.
Betrachte das folgende Bild:
Es besteht aus $2 \times 3$, also insgesamt $6$ Pixel. In Python wird dieses Bild durch das folgende Numpy-Array beschrieben:
img = np.array( [[[255,0,0,255], # red [0,255,0,255], # green [0,0,255,255]], # blue [[255,0,255,255], # pink [255,255,255,255], # white [0,0,0,255]]] # black )
Dieses Arrays ist also ein 3D-Array mit Shape (img.shape
) $(2, 3, 4)$.
Der folgende Code liest das Bild input_image.png
(im gleichen Ordner wie Python-File) ein und speichert es unter dem Namen output_image.png
. Achtung: Das Bild output_image.png
wird bei jedem Ausführen überschrieben.
import numpy as np from skimage import io # to read image import matplotlib.pyplot as plt # to show (and save) image import copy img_org = io.imread('input_image.png') # read image, is stored as numpy-array in variable img # make copy of image before you manipulate it img = copy.deepcopy(img_org) # here can manipulate img pass # show image plt.axis('off') # Turn off axis ticks and labels plt.tight_layout(pad=0) # Remove padding around the image plt.imshow(img) # For color images plt.show() # save image plt.savefig(`output_image.png`)
Möchtest du einen Code schreiben, der dir ein Bild zeichnet? Dann ist es eine gute Idee, mit einem mit lauter Nullen gefüllten Numpy-Array mit der richtigen Dimension anzufangen:
img = np.zeros((32,64,4),dtype=int)
dtype=int
stellt sicher, dass im Array nur ganze Zahlen (integers) und keine Nachkommazahlen stehen. Ohne dies kann man die Transparenz (Alpha) nicht einstellen.
Colors Andy Warhol-Style: Farbkanal isolieren
Beispiel oben links (rot): Für alle Pixel werden R und G channels auf $0$ gesetzt.
pip install numpy pip install scikit-image pip install matplotlib
Falls dies nicht funktioniert, probiere (passe e.v. Python Version an!!!)
py -3.11 -m pip install numpy py -3.11 -m pip install scikit-image py -3.11 -m pip install matplotlib
anschae
/ tkilla77
)..ipynb
.pixel_art.ipynb
im Repo und arbeite darin.img = ...
und zeige das Bild mit matplotlib an.In der letzten Aufgabe hast du gesehen, dass es ziemlich mühsam ist, mit einem Numpy-Array ein Bild zu designen. Je grösser das Bild sein soll, desto schlimmer wird es. Wir wollen deshalb eine Funktion schreiben, die es uns erlaubt, auf einfache Art und weise ein Pixel Art Bild zu zeichnen.
Schreibe deshalb eine Funktion create_pixel_img_from_str(img_str)
, die eine Liste mit Strings, die das Bild beschreiben, entgegennimmt. Sie generiert dann das entsprechende Numpy-Array und gibt es zurück.
Zum Beispiel soll der Code …
img_str = [ " rrrrr ", " rrrrrrrrr ", " kkkssks ", " ksksssksss ", " kskksssksss ", " kksssskkkk ", " sssssss ", " bbrbbb ", " bbbrbbrbbb ", " bbbbrbbrbbbb ", " ssbbrrrrbbss ", " sssryrryrsss ", " ssrrrrrrrrss ", " rrr rrr ", " kkk kkk ", " kkkk kkkk ", ] img = create_pixel_img_from_str(img_str) plt.axis('off') plt.tight_layout(pad=0) plt.imshow(img) plt.show()
Die Buchstaben stehen für die verschiedenen Farben, z.B. 'r' für Rot, 'y' für Gelb (Yellow), 's' für Haut (Skin). Ein Leerschlag steht für transparent ($[0,0,0,0]$). Es lohnt sich aber, den Code so zu schreiben, dass er eine Vielzahl an Farben beinhaltet. Du kannst gerne meine Farben übernehmen, diese abändern und weitere hinzu fügen.
Mache damit tolle Pixel Art!
Erstelle mehrere Pixel Images wie in der Aufgabe vorher und animiere diese. Speichere sie dann als GIF.
Der folgende Code dient als Inspiration:
Einfache Effekte:
Programmiere mind. zwei dieser Effekte. Mache es selbst und ohne direkte Hilfe (z.B. von ChatGPT).
Hole dir Hilfe nur für allgemeine Fragen. Prompt in ChatGPT darf nicht sein „Wie invertiere ich ein Bild in Python“, sondern sollte sein „Wie kann ich ein Numpy Array erstellen?“
Überlege dir andere oder eigene Effekte, probiere aus, sei kreativ und erstelle damit neue Versionen eine Bilds (z.B. der Grumpy Cat).
Programmiere ein eigenes Bildbearbeitungsprogramm mit einer graphischen Oberfläche, welches folgendes kann:
Tipps: