Kapitel 30
Rechnen mit NumPy
868
dinaten bestimmt, die auf das Koordinatensystem des Diagramms bezogen sind. Dabei ist
(0, 0) der Ursprung und (1, 1) die Ecke oben rechts.
30.12 Vergleiche
Zwei Arrays können mit den üblichen Vergleichsoperatoren (<, <=, >, >=, ==, !=) element-
weise verglichen werden. Das Ergebnis ist ein Array mit Wahrheitswerten:
Mit den Funktionen
logical_or() und logical_and() können Sie zusammengesetzte
Bedingungen konstruieren. Sie können nicht die normalen logischen Operatoren wie
&
oder | verwenden:
30.13 Projekt: Wolken am Himmel
Das folgende Programm wertet ein Foto eines Himmelsauschnitts aus und ermittelt den
Bewölkungsgrad. Zur Kontrolle werden zwei Bilder ausgegeben. Im ersten Bild wird für
jedes Pixel der relative Blauanteil dargestellt. Das ist der Quotient aus dem Blauanteil divi-
diert durch den Grauwert des Pixels. Der Grauwert wiederum ist der Durchschnitt der drei
Linienformate in Diagrammen
Wenn mehrere Zahlenreihen in ein und demselben Diagramm dargestellt werden sollen,
muss man die Linien optisch unterscheiden können. Dazu geben Sie in der
plot()-
Anweisung hinter jedem Array für das Linienformat einen Formatstring an. Das ist ein
String, der aus zwei Teilen zusammengesetzt ist: Farbe plus Form. Die Farbe wird durch
einen Buchstaben aus der englischen Bezeichnung spezifiziert: (y)ellow, (g)reen, (b)lue,
(c)yan, (r)ed, (m)agenta, (w)hite, blac(k). Für die Form verwendet man die Zeichen aus der
folgenden Abbildung:
Beispiele:
"r-" (rote durchgezogene Linie), "gs" (grüne Quadrate)
>>> a = np.array([[1, 2], [2, 0]])
>>> b = np.array([[1, 2], [2, 3]])
>>> print (a == b)
[[ True True]
[ True False]]
>>> a = np.array([0, 1, 2, 3, 4, 5, 6, 7])
>>> b = np.logical_and (a >= 3, a <= 5)
>>> print(b)
[False False False True True True False False]
"-" "o" "." "--" "s" "^"
869
30.13
Projekt: Wolken am Himmel
RGB-Farbanteile (0 = Schwarz, 255 = Weiß). Die hellen Bereiche auf dem Bild stellen
blauen Himmel dar (hoher relativer Blauanteil).
Abb. 30.5: Darstellung des relativen Blauanteils der Pixel des Wolkenbildes mit Farbskala. Je
heller, desto höher der relative Blauanteil.
Das zweite Bild verwendet einen Schwellenwert. Wenn der Blauanteil eines Pixels größer als
1,3 ist, wird das Pixel als »blauer Himmel« gewertet und erhält den Wert
1 (True). Ansonsten
gehört es zu einer Wolke und erhält den Wert
0 (False). Diese Darstellung ist die Grundlage
für die Berechnung des Bewölkungsgrades, also des Anteils des Himmels, der mit Wolken
bedeckt ist. Dieser Wert wird am Ende ausgegeben. In diesem Beispiel ist es
0.32.
Abb. 30.6: Darstellung der Wolken als schwarze Flecken auf weißem Hintergrund
Kapitel 30
Rechnen mit NumPy
870
Das folgende Skript implementiert diese Idee. Es verwendet die Visualisierungsroutine
imshow() aus dem Modul matplotlib.pyplot. Die beiden Bilder werden nacheinander
(nicht gleichzeitig) in einem separaten Fenster gezeigt. Erst, wenn das Fenster mit dem ers-
ten Bild geschlossen worden ist, erscheint das zweite Bild.
Die zentrale Datenstruktur des Programms ist die Repräsentation des Fotos als dreidimen-
sionales Array. Jedes Pixel wird durch eine Folge von drei Zahlen zwischen 0 und 255 dar-
gestellt, den drei RGB-Farbanteilen des Pixels. Diese Pixeldarstellung ist die dritte Achse des
Arrays. Wenn Sie das Array mit
print() auf dem Bildschirm ausgeben, erhalten Sie eine
Darstellung, die bei unserem Wolkenfoto so beginnt:
Das sind die ersten drei Pixel am oberen Rand des Bildes. An den drei eckigen Klammern
zu Beginn erkennen Sie, dass das Array drei Dimensionen besitzt.
Skript:
Erläuterung:
#1: Aus der Bilddatei wird zunächst ein PIL.Image-Objekt erzeugt und daraus ein dreidi-
mensionales Array (Objekt der Klasse
numpy.ndarray) gebildet. Dabei ist jedes Pixel eine
Folge von drei Zahlen zwischen 0 und 255, den drei RGB-Farbanteilen des Pixels.
#2: Hier wird ein Array erzeugt, das für jedes Pixel des Originalfotos den relativen Blauanteil
darstellt. Das Array
img[:., :, 2] ist ein zweidimensionales Array, das allein die Blauwerte
(Zahlen zwischen 0 und 255) enthält. Der Funktionsaufruf
np.mean(img, axis=2) liefert
ein zweidimensionales Array, das für jedes Pixel den Grauwert (Durchschnitt der drei RGB-
Werte) darstellt. Der Quotient dieser beiden Arrays ist ein Array, bei dem jedes Element als
Quotient aus RGB-Anteil und Grauwert eines Pixels berechnet worden ist.
[[[ 15 42 85]
[ 16 43 86]
[ 17 44 87]
...
# clouds.py
import PIL
import numpy as np
import matplotlib.pyplot as plt
img = np.array(PIL.Image.open("Wolken.png")) #1
img_blue = img[:, :, 2] / np.mean(img, axis=2) #2
plt.imshow(img_blue, cmap=plt.cm.gray) #3
plt.colorbar() #4
plt.show() #5
img_bw = img_blue > 1.3 #6
plt.imshow(img_bw, cmap=plt.cm.gray)
plt.colorbar()
plt.show()
print(1 - np.mean(img_bw)) #7

Get Python 3 - Lernen und professionell anwenden now with the O’Reilly learning platform.

O’Reilly members experience books, live events, courses curated by job role, and more from O’Reilly and nearly 200 top publishers.