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
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
vonPillow
(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 übersize
. - 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:

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
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:
# 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)

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
