Bilder sind Arrays von Zahlen#

Numpy ist eine Bibliothek zur Verarbeitung mehrdimensionaler Listen von Zahlen, von denen mikroskopische Bilder (Stapel, Mehrkanal, Zeitraffer usw.) ein prominentes Beispiel sind. Hier geben wir eine Einführung in diese Bibliothek.

Siehe auch

import numpy as np
from matplotlib.pyplot import imshow

Numpy Arrays#

Ein Bild ist einfach eine zweidimensionale Liste von Pixelwerten, mit anderen Worten eine Matrix, mit einer bestimmten Anzahl von Zeilen und Spalten. Daher können wir es als Liste von Listen definieren, wobei jede Liste eine Zeile von Pixeln darstellt:

raw_image_array = [
    [1, 0, 2, 1, 0, 0, 0],
    [0, 3, 1, 0, 1, 0, 1],
    [0, 5, 5, 1, 0, 1, 0],
    [0, 6, 6, 5, 1, 0, 2],
    [0, 0, 5, 6, 3, 0, 1],
    [0, 1, 2, 1, 0, 0, 1],
    [1, 0, 1, 0, 0, 1, 0]
]
raw_image_array
[[1, 0, 2, 1, 0, 0, 0],
 [0, 3, 1, 0, 1, 0, 1],
 [0, 5, 5, 1, 0, 1, 0],
 [0, 6, 6, 5, 1, 0, 2],
 [0, 0, 5, 6, 3, 0, 1],
 [0, 1, 2, 1, 0, 0, 1],
 [1, 0, 1, 0, 0, 1, 0]]
imshow(raw_image_array)
<matplotlib.image.AxesImage at 0x1f9fbdb4b80>
../_images/33579b8adbd4882cc6a8cf342ee2d65b004107c04199c41a019e636cdd7d5fc6.png

Diese Ausgabe ist fast dieselbe wie oben, mit dem Unterschied, dass jetzt angegeben wird, dass wir es mit einem Numpy array zu tun haben. Solche Numpy-Arrays können nun als eine Einheit behandelt werden, und wir können die Berechnungen durchführen, die wir vorher nicht konnten:

image = np.asarray(raw_image_array)
image - 2
array([[-1, -2,  0, -1, -2, -2, -2],
       [-2,  1, -1, -2, -1, -2, -1],
       [-2,  3,  3, -1, -2, -1, -2],
       [-2,  4,  4,  3, -1, -2,  0],
       [-2, -2,  3,  4,  1, -2, -1],
       [-2, -1,  0, -1, -2, -2, -1],
       [-1, -2, -1, -2, -2, -1, -2]])

Beachten Sie, dass diese Berechnungen sehr effizient sind, da sie vektorisiert sind, d.h. sie können prinzipiell parallel ausgeführt werden.

Zwei wichtige Eigenschaften#

Arrays wie image haben verschiedene Eigenschaften. Zwei der wichtigsten sind:

  • die shape des Arrays, d.h. die Anzahl der Zeilen, Spalten (und Kanäle, Ebenen usw. für mehrdimensionale Bilder)

  • der dtype des Arrays, d.h. ein Bild vom Typ int64 hat 2 hoch 64 verschiedene Grauwerte.

image.shape
(7, 7)
image.dtype
dtype('int32')

Andere Möglichkeiten, Arrays zu erstellen#

Bei der Arbeit mit Bildern erstellen wir oft künstliche Bilder, um zu sehen, was Filter mit ihnen machen. Zum Beispiel können wir ein Bild erstellen, bei dem alle Pixel den Wert 0 haben, außer einem einzigen, indem wir die Numpy-Funktion np.zeros verwenden. Dafür muss eine Bildgröße angegeben werden.

image_size = (6, 5)

image1 = np.zeros(image_size)
image1
array([[0., 0., 0., 0., 0.],
       [0., 0., 0., 0., 0.],
       [0., 0., 0., 0., 0.],
       [0., 0., 0., 0., 0.],
       [0., 0., 0., 0., 0.],
       [0., 0., 0., 0., 0.]])
imshow(image1)
<matplotlib.image.AxesImage at 0x1f9fc000f10>
../_images/09ab260b13e1180841a9b181822ccdb5209c5d97e5dc706f824ab54453d51510.png

Da Bilder einfach Arrays sind, setzen wir Pixelwerte so, als würden wir auf Arrays zugreifen. Daraus lernen Sie auch, dass die erste Achse (Koordinate 0) von oben nach unten verläuft, während die zweite Achse (Koordinate 3) von links nach rechts geht.

image1[0,3] = 1

imshow(image1)
<matplotlib.image.AxesImage at 0x1f9fbe7ad90>
../_images/6c0bf2b62d8284502bf59c08097c2d117beb30ee0ab6ec71ee180f0b186cf857.png

Um Rauschen zu untersuchen, können wir zum Beispiel ein Bild mit zufälligen Werten erstellen, indem wir np.random.random verwenden.

image_random = np.random.random((6, 5))
imshow(image_random)
<matplotlib.image.AxesImage at 0x1f9fbef72e0>
../_images/285da33e574aa7a0a1b7dd67933652ded803861171b3da6713e7cb11154f2dae.png