Wie ein Computer ein Bild sieht
Ein digitales Bild besteht aus Pixeln, kleinen Bildpunkten, und jedes Pixel ist nur eine Zahl oder eine kurze Liste von Zahlen. Ein Computer sieht also kein Foto, sondern ein Raster aus Zahlen.
Wer das weiß, kann Bilder mit gewöhnlichem Code lesen, messen und verändern. Das üben Sie in diesem Modul an fünf Bildern, die das Lab für Sie zeichnet.
Am Ende dieser Lektion
Notiz
Ich kann ein Bild als Raster aus Zahlen lesen und den Helligkeitswert eines Pixels abfragen.
Schlüsselwörter
| Begriff | Was er bedeutet | Beispiel |
|---|---|---|
| Pixel | ein Bildpunkt, gespeichert als Zahlen | |
| Array | ein Raster aus Zahlen in Zeilen und Spalten | |
| Modus | wie die Zahlen eines Pixels angeordnet sind | RGB |
| Kanal | eine Ebene aus Zahlen, zum Beispiel Rot | |
| Grauwert | Helligkeit von 0 (schwarz) bis 255 (weiß) |
Die Zellen, die Lernende ausfüllen, bleiben in dieser Vorschau leer.
Jedes Pixel ist eine Zahl oder drei Zahlen
Ein Graubild speichert pro Pixel eine Zahl von 0 bis 255. Null ist schwarz, 255 ist weiß. Ein Farbbild speichert drei Zahlen: Rot, Grün und Blau, kurz RGB. Jede dieser Zahlen heißt ein Kanal.
Ein Bild mit 320 Pixeln Breite und 240 Pixeln Höhe hat 76800 Pixel. Die Pixel liegen in Zeilen und Spalten, genau wie die Zellen einer Tabelle.
Beispiel: ein Graubild, drei Zeilen, vier Spalten
| Zeile | Spalte 0 | Spalte 1 | Spalte 2 | Spalte 3 |
|---|---|---|---|---|
| 0 | 12 | 40 | 200 | 35 |
| 1 | 18 | 250 | 60 | 22 |
| 2 | 10 | 30 | 45 | 15 |
Die Zellen, die Lernende ausfüllen, bleiben in dieser Vorschau leer.
Ein Pixel in Python lesen
# Ein kleines Graubild: drei Zeilen, vier Spalten.
bild = [
[12, 40, 200, 35],
[18, 250, 60, 22],
[10, 30, 45, 15],
]
print("Zeilen:", len(bild))
print("Spalten:", len(bild[0]))
print("Pixel in Zeile 0, Spalte 2:", bild[0][2])
# Ändern Sie Zeile und Spalte und starten Sie erneut.
Das Lab zeichnet fünf Bilder
Im Ordner images liegen coins.png, gradient.png, road.png, scan.png und shapes.png. Das Lab zeichnet sie bei jedem Start mit denselben Zahlen, daher sehen alle dieselben Werte.
Der erste Befehl listet die Dateien auf, in alphabetischer Reihenfolge. Das Terminal hat kein eigenes Python, deshalb beginnt jeder Befehl mit docker exec jupyter.
Die fünf Bilder auflisten
docker exec jupyter ls imagesHier angezeigt, nicht ausgeführt. Erstellen Sie ein kostenloses Konto, um „Ausführen“ zu drücken und ihn im Terminal Ihres eigenen Labs einzugeben.
Das Skript look.py liest ein Münzbild
Die Skripte des Labs geben englische Wörter aus: size heißt Größe, mode heißt Modus, pixel at heißt Pixel bei. Auf die Zahlen kommt es an.
Das Münzbild ist 320 Pixel breit und 240 hoch, im Modus RGB. Das Pixel bei 10, 10 hat die Werte (35, 35, 35), fast schwarz, also Hintergrund. Das Pixel bei 50, 50 hat (197, 157, 62), ein Goldton: Teil einer Münze. Der mittlere Grauwert des ganzen Bildes ist 57,6, also dunkel.
Das Münzbild lesen lassen
docker exec jupyter python3 steps/look.pyHier angezeigt, nicht ausgeführt. Erstellen Sie ein kostenloses Konto, um „Ausführen“ zu drücken und ihn im Terminal Ihres eigenen Labs einzugeben.
NumPy zählt Zeile zuerst, Pillow Breite zuerst
Pillow ist die Bibliothek, die Bilddateien öffnet. NumPy macht aus dem Bild ein Array und rechnet damit schnell.
Pillow nennt die Größe als (Breite, Höhe), also (320, 240). NumPy nennt die Form als (Höhe, Breite, Kanäle), also (240, 320, 3). Die Reihenfolge ist verschieden, und das ist die häufigste Fehlerquelle am Anfang.
Die Form des Münzbildes als Array
docker exec jupyter python3 -c "from PIL import Image; import numpy as np; print(np.array(Image.open('images/coins.png')).shape)"Hier angezeigt, nicht ausgeführt. Erstellen Sie ein kostenloses Konto, um „Ausführen“ zu drücken und ihn im Terminal Ihres eigenen Labs einzugeben.
Ein Graubild hat nur zwei Maße
Das Bild gradient.png ist ein glatter Verlauf von Schwarz links bis Weiß rechts. Es hat 64 Zeilen und 256 Spalten und keinen Farbkanal, weil jedes Pixel nur einen Grauwert hat.
Der Befehl gibt Form, Pixel oben links und Pixel oben rechts aus. Das ist (64, 256) 0 255: schwarz und weiß an den beiden Enden.
Den Verlauf lesen
docker exec jupyter python3 -c "from PIL import Image; import numpy as np; z = np.array(Image.open('images/gradient.png')); print(z.shape, z[0, 0], z[0, 255])"Hier angezeigt, nicht ausgeführt. Erstellen Sie ein kostenloses Konto, um „Ausführen“ zu drücken und ihn im Terminal Ihres eigenen Labs einzugeben.
Ein häufiger Fehler
Warnung
Viele denken, ein Pixel liege bei (Zeile, Spalte), egal in welcher Bibliothek. Pillows getpixel fragt aber nach (Spalte, Zeile), also (x, y). Ein NumPy-Array fragt bild[zeile, spalte]. Prüfen Sie im Zweifel die Form und probieren Sie ein Pixel an einem Rand aus.