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
/tmp/ipykernel_1472/1441957223.py:1: DeprecationWarning:
Pyarrow will become a required dependency of pandas in the next major release of pandas (pandas 3.0),
(to allow more performant data types, such as the Arrow string type, and better interoperability with other libraries)
but was not found to be installed on your system.
If this would cause problems for you,
please provide us feedback at https://github.com/pandas-dev/pandas/issues/54466

  import pandas as pd

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.
../../_images/03-einsatzszenarien_01_maschinelles-sehen_01_Repraesentation_von_Grauwertbildern_3_6.svg

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]:
(0, 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()
../../_images/03-einsatzszenarien_01_maschinelles-sehen_01_Repraesentation_von_Grauwertbildern_12_0.svg

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()
../../_images/03-einsatzszenarien_01_maschinelles-sehen_01_Repraesentation_von_Grauwertbildern_15_0.svg

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:

Creative Commons Lizenzvertrag     Dieses Werk von Marvin Kastner ist lizenziert unter einer Creative Commons Namensnennung 4.0 International Lizenz.