Skip to content

Bilder erzeugen

Programmieren

Eine Möglichkeit Höhendaten zweidimensional darzustellen wäre eine Heatmap (z.B. höher = heller) oder eine Schattierung. Für beide Darstellungen müssen wir einzelne Bildpunkte setzen und so ein Bild erstellen.

Modul «PIL»

Mit dem Modul PIL (heute Pillow) können wir mit Python Bilder erzeugen und bearbeiten. Wir machen ein Bild mit vorgegeben Dimensionen (Anzahl Pixel in Breite und Höhe) und setzen dann für jeden Pixel einen RGB-Farbwert:

Beispiel

Farbverlauf erstellen. Achtung Farbe-Werte RGB zwischen 0 und 255

python
from PIL import Image

image = Image.new(mode="RGB", size=(500, 250), color="blue")
pixel_map = image.load()
width, height = image.size

for y in range(height):
    for x in range(width):
        pixel_map[x,y] = (x, y, 255-(x+y)//2)

image.save("output.png", format="png")  # speichern
image.show()                            # anzeigen (extern)
Zeile 1
Wir importieren die Klasse Image von Pillow (PIL = Python Image Library)
ab Zeile 3
Jetzt können wir ein Bild erstellen. Dazu geben wir Grösse und Hintergrundfarbe an.
Anschliesssen holen wir die Pixel-Map, also alle Bildpunkte anpsrechbar über Koordinaten.
Nun müssen wir noch die Dimenstionen des Bildes kennen. Die kriegen wir über size.
ab Zeile 7
Jetzt können wir in einer verschachtelten Schleife alle Bildpunkt durchgehen.
Dabei setzen wir für jeden Punkte ein Farbe basierend auf seinen Koordinaten.
ab Zeile 11
Schlussendlich müssen wir das Ergebnis speichern oder anzeigen

Hilfsfunktion «clamp»

Wir brauchen eine Hilfsfunktion welche die Werte einschränkt, wie eine Klammer:

clamp

So können wir sicherstellen, dass der Wert x zwischen a und b «eingeklammert» wird, also b nicht über- und a nicht unterschreitet.

Aufgabe: Hilfsfunktion «clamp»

Definiere eine Funktion clamp(). Diese erhält drei Argumente a, x und b.
Der Rückgabewert ist x auf den Bereich zwischen a und b eingeschränkt. Wenn wir also clamp(0, x, 255) aufrufen, stellen wir sicher, dass auch wenn x<0 oder x>255 kein ungültiger RGB-Farbwert rauskommt.

python
def clamp(a, x, b):
    return x

Tipp: Verwende die vorhandenen Funktionen max und min oder arbeite mit if-else.

Hier kannst du deine clamp-Funktion testen:

python
# Test für Farbkanal
for x in [-23, 0, 12, 34, 255, 300, 1020]:
    r = clamp(0,x,255)
    print("  {:5}   -> {:5}".format(x,r))

# Test für floats
import random

i = 0
while i<8:
    r = random.random()
    z = clamp(0.4, r, 0.6)
    print("{:2f}  ->  {:2f}".format(r,z))
    i = i + 1

Heatmap

Aufgabe: Heatmap

Wir können die Höhenangaben als Heatmap darstellen: Hohe Punkte hell, tiefe Punkte dunkel. Dazu müssen wir aus der Höhe einen Grauwert zwischen 0 und 255 berechnen und dem zur Koordinate passenden Punkt im Bild zuweisen.

Alternativ kann man auch je nach Höhe einen Wert zuweisen:

  • höchste Punkte weiss (Schnee)
  • hohe Punkte grau (Fels)
  • tiefere Punkte grün (Wald/Gras)
  • tiefste Punkte blau (Meer, Fluss, See)
heatmap (Graustufen)

Schattierung

Aufgabe: Schattierung

Um eine Schattierung zu berechnen, vergleichen wir jede Koordinate mit einer Nachbarkoordinate. Aus dem Höhenunterschied können wir einen Wert berechnen, z.B.

  • bei gleicher Höhe grau
  • höher = heller
  • tiefer = dunkler
Schattierung (Graustufen)

Gymnasium Kirchenfeld, fts & ros