Repräsentation von Grauwertbildern¶
Bilder werden häufig in Form von Rastergrafiken gespeichert. Dies bedeutet, dass ein Bild mit einer Breite \(m\) und einer Höhe \(n\) dann \(m \times n\) Pixel groß ist. Ein Pixel ist ein „Picture Element“, also die Farbe an einer bestimmten Stelle. Ein Bild kann somit als eine Matrix von Pixeln dargestellt werden.
[1]:
import pandas as pd
import imageio.v2 as imageio
import matplotlib.pyplot as plt
Die Bibliothek imageio enthält eine Reihe von Beispielbildern.
[2]:
gray_image = imageio.imread("imageio:camera.png")
plt.imshow(gray_image, cmap="gray")
plt.show()
Imageio: 'camera.png' was not found on your computer; downloading it now.
Try 1. Download from https://github.com/imageio/imageio-binaries/raw/master/images/camera.png (136 kB)
Downloading: 8192/139512 bytes (5.9%)139512/139512 bytes (100.0%)
Done
File saved as /home/docs/.imageio/images/camera.png.
Ein Bild verfügt über eine Breite und eine Höhe. Wie man oben an der X- und Y-Achse sieht, ist das Bild etwas über 500 Pixel hoch und breit. Grauwertbilder haben nur einen Zahlenwert je darzustellenden Pixel, den Intensitätswert an der jeweiligen Position.
Das Bild wird intern als eine zweidimensionale Matrix abgespeichert.
[3]:
gray_image.ndim
[3]:
2
Im Hintergrund ist das Bild ein Array von Arrays mit Intensitätswerten.
[4]:
gray_image
[4]:
array([[200, 200, 200, ..., 189, 190, 190],
[200, 199, 199, ..., 190, 190, 190],
[199, 199, 199, ..., 190, 190, 190],
...,
[ 25, 25, 27, ..., 139, 122, 147],
[ 25, 25, 26, ..., 158, 141, 168],
[ 25, 25, 27, ..., 151, 152, 149]], dtype=uint8)
Es gibt viele Standards für die Intensitätswerte. Deswegen sollte man jedes Mal überprüfen, in welchem Format ein Bild vorliegt. Dafür werden die kleinsten und größten Intensitätswerte betrachtet.
[5]:
gray_image.min(), gray_image.max()
[5]:
(np.uint8(0), np.uint8(255))
Die Pixel rangieren zwischen 0 und 255, sprich insgesamt 256 verschiedene Werte.
Ausschneiden von Bildteilen¶
Wir können auf die Matrix über die Standard-Operatoren von Python zugreifen. Einer davon ist der Doppelpunkt zur Bestimmung von Abschnitten. So können wir z. B. die abgebildete Kamera ausschneiden. Der Zugriff erfolgt über BILDMATRIX[Y-Achse, X-Achse].
[6]:
plt.imshow(
gray_image[100:200, 250:350], # [ymin:ymax, xmin:xmax] beschreibt den Zuschnitt
cmap="gray", # visuelle Darstellung in Grauwerten
vmin=0, # 0 entspricht schwarz
vmax=255 # 255 entspricht weiß
)
plt.show()
Der Doppelpunkt beschreibt hier eine Range. Auf der Y-Achse werden die Werte von 100 bis 200 und auf der X-Achse die Werte von 250 bis 350 ausgewählt.
Nun betrachten wir das Kamera-Rohr genauer.
[7]:
plt.imshow(
gray_image[135:150, 305:335], # [ymin:ymax, xmin:xmax] beschreibt den Zuschnitt
cmap="gray", # visuelle Darstellung in Grauwerten
vmin=0, # 0 entspricht schwarz
vmax=255 # 255 entspricht weiß
)
plt.show()
Die Zahlen-Matrix, mithilfe der dieses Bild intern repräsentiert wird, lässt sich auch direkt einsehen. Mit pd.DataFrame wird der Datentyp als eine hübsche Tabelle dargestellt.
[8]:
pd.DataFrame(gray_image[140:160, 320:340])
[8]:
| 0 | 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | 9 | 10 | 11 | 12 | 13 | 14 | 15 | 16 | 17 | 18 | 19 | |
|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|
| 0 | 67 | 79 | 88 | 95 | 183 | 212 | 213 | 212 | 213 | 213 | 213 | 212 | 212 | 212 | 212 | 212 | 211 | 212 | 212 | 212 |
| 1 | 73 | 85 | 89 | 106 | 157 | 214 | 212 | 212 | 213 | 213 | 213 | 212 | 213 | 213 | 212 | 212 | 211 | 213 | 212 | 212 |
| 2 | 93 | 105 | 106 | 125 | 138 | 215 | 212 | 212 | 212 | 212 | 211 | 212 | 211 | 213 | 212 | 213 | 212 | 213 | 213 | 212 |
| 3 | 129 | 132 | 132 | 155 | 130 | 214 | 212 | 212 | 213 | 213 | 213 | 213 | 213 | 214 | 213 | 213 | 212 | 214 | 213 | 212 |
| 4 | 163 | 163 | 164 | 194 | 133 | 216 | 213 | 212 | 213 | 213 | 213 | 213 | 213 | 212 | 213 | 212 | 214 | 214 | 213 | 212 |
| 5 | 179 | 196 | 196 | 242 | 152 | 216 | 212 | 213 | 214 | 214 | 213 | 214 | 212 | 213 | 213 | 213 | 214 | 214 | 213 | 213 |
| 6 | 171 | 214 | 215 | 214 | 126 | 217 | 213 | 213 | 214 | 213 | 213 | 213 | 213 | 213 | 214 | 213 | 213 | 212 | 213 | 214 |
| 7 | 120 | 102 | 113 | 122 | 120 | 216 | 213 | 214 | 213 | 213 | 213 | 213 | 213 | 212 | 213 | 214 | 212 | 213 | 213 | 213 |
| 8 | 76 | 87 | 90 | 97 | 124 | 215 | 213 | 213 | 213 | 213 | 213 | 214 | 213 | 213 | 213 | 213 | 213 | 213 | 213 | 213 |
| 9 | 56 | 62 | 64 | 89 | 142 | 214 | 213 | 213 | 213 | 213 | 213 | 213 | 214 | 214 | 214 | 213 | 213 | 213 | 213 | 213 |
| 10 | 50 | 76 | 76 | 92 | 141 | 214 | 212 | 213 | 214 | 214 | 213 | 213 | 213 | 214 | 213 | 213 | 213 | 213 | 214 | 213 |
| 11 | 46 | 79 | 84 | 88 | 144 | 215 | 214 | 213 | 214 | 214 | 214 | 213 | 213 | 213 | 213 | 213 | 213 | 214 | 214 | 214 |
| 12 | 40 | 62 | 93 | 93 | 153 | 215 | 213 | 214 | 214 | 213 | 213 | 214 | 213 | 213 | 213 | 213 | 213 | 212 | 213 | 213 |
| 13 | 33 | 43 | 51 | 71 | 165 | 213 | 214 | 214 | 214 | 214 | 213 | 213 | 213 | 214 | 213 | 214 | 213 | 214 | 214 | 213 |
| 14 | 30 | 33 | 38 | 63 | 181 | 213 | 213 | 214 | 214 | 213 | 214 | 214 | 214 | 213 | 213 | 214 | 213 | 213 | 213 | 213 |
| 15 | 41 | 58 | 64 | 79 | 204 | 214 | 214 | 214 | 215 | 214 | 214 | 214 | 213 | 214 | 213 | 213 | 213 | 213 | 214 | 214 |
| 16 | 187 | 193 | 195 | 194 | 213 | 213 | 214 | 214 | 214 | 214 | 213 | 214 | 214 | 214 | 214 | 213 | 213 | 214 | 213 | 213 |
| 17 | 214 | 214 | 214 | 214 | 214 | 214 | 215 | 214 | 214 | 214 | 214 | 213 | 214 | 214 | 214 | 214 | 214 | 214 | 214 | 213 |
| 18 | 214 | 215 | 215 | 215 | 215 | 215 | 214 | 215 | 215 | 215 | 215 | 215 | 214 | 215 | 214 | 214 | 214 | 215 | 215 | 214 |
| 19 | 216 | 215 | 215 | 214 | 216 | 216 | 216 | 215 | 215 | 215 | 216 | 215 | 214 | 215 | 215 | 215 | 215 | 215 | 215 | 215 |
Aufgabe
Vergleichen Sie die Matrix mit dem Bild. Was repräsentieren hier die kleinen, was die großen Zahlen?
Antwort: …
Dieses Werk von Marvin Kastner ist lizenziert unter einer Creative Commons Namensnennung 4.0 International Lizenz.