Bilder sind Matrizen
Ein Graustufenbild ist im Wesentlichen ein zweidimensionales NumPy-Array. Wenn Sie die Matrix transponieren, spiegeln, zuschneiden oder falten, ändert sich das Bild entsprechend.
Nach Abschluss dieses Falls verstehen Sie:Die Grundlage der Bildverarbeitung ist lineare Algebra; eine Matrix ist nur eine Tabelle mit Zahlen.
Alltägliche Einführung
Pixelraster eines Fotos
Zoomen Sie auf Ihrem Telefon in ein Foto hinein und noch einmal hinein – bis Sie winzige Quadrate sehen können. Jedes Quadrat hat nur einen Farbwert: 0 bedeutet reines Schwarz, 255 bedeutet reines Weiß, und die Zahlen dazwischen sind verschiedene Graustufen.
Das gesamte Foto ist ein rechteckiges Array dieser winzigen Quadrate – Mathematiker nennen es eine "Matrix」。
Intuitive Vorstellung
Eine Matrix ist kein mysteriöses Konzept – sie ist einfach eine mit Zahlen gefüllte Tabelle.
Zum Beispiel repräsentiert in der folgenden \(3 \times 3\)-Matrix jede Zahl die Helligkeit eines Pixels (0 ist am dunkelsten, 1 am hellsten):
Mit diesem Verständnis werden die verschiedenen Operationen der Bildverarbeitung klar:
Wenn Sie in Photoshop auf eine Schaltfläche klicken, arbeitet hinter den Kulissen NumPy mit einem zweidimensionalen Array.
Mathematische Definition
Ein \(H \times W\)-Graustufenbild kann als reellwertige Matrix dargestellt werden:
\[ M \in \mathbb{R}^{H \times W}, \quad M_{ij} \in [0, 1] \]wobei \(M_{ij}\) den Pixelhelligkeitswert an der \(i\)-ten Zeile und \(j\)-ten Spalte darstellt.
Kernkonzepte der Matrixoperationen:
| Aktion | Mathematischer Ausdruck | NumPy-Syntax | Bildeffekt |
|---|---|---|---|
| Transponieren | \(M^T_{ij} = M_{ji}\) | img.T | Zeilen und Spalten vertauschen, entlang der Diagonalen spiegeln |
| Horizontales Spiegeln | \(M'_{ij} = M_{i, W-1-j}\) | img[:, ::-1] | Spaltenindizes umkehren |
| Vertikales Spiegeln | \(M'_{ij} = M_{H-1-i, j}\) | img[::-1, :] | Zeilenindex umkehren |
| Mittelwert-Weichzeichnung | \(M'_{ij} = \frac{1}{k^2}\sum_{p,q} M_{i+p, j+q}\) | Gleitendes Fenster zur Berechnung von mean() | Jedes Pixel durch den Nachbarschaftsmittelwert ersetzen |
Die bei der Mittelwert-Weichzeichnung verwendete "gleitende Fenster"-Operation ist im WesentlichenFaltungihr Prototyp — die Kernoperation von Convolutional Neural Networks (CNN).
Praktische Python-Übung
Erzeugen Sie ein synthetisches Graustufenbild und verwenden Sie NumPy-Array-Operationen, um Transponieren, Spiegeln, Zuschneiden und handgeschriebene Faltungs-Weichzeichnung zu implementieren.
Beispiel
import matplotlib
matplotlib.use("Agg")
import matplotlib.pyplot as plt
import os
# Ausgabeverzeichnis erstellen
OUT = os.path.join(os.path.dirname(os.path.abspath(__file__)), "outputs")
os.makedirs(OUT, exist_ok=True)
# 1. Generiere ein synthetisches Graustufenbild: diagonaler Gradient + helles Quadrat in der Mitte
size = 64
img = np.zeros((size, size))
for i in range(size):
for j in range(size):
img[i, j] = (i + j) / (2 * size) # Diagonaler Gradient von dunkel nach hell
img[20:44, 20:44] += 0.6 # Füge ein helles Quadrat in der Mitte hinzu
img = np.clip(img, 0, 1) # Auf den Bereich [0, 1] begrenzen
print("BEISPIEL Bildmatrix-Form:, img.shape)
print("Erster 3x3-Teil der Bildmatrix:\n", np.round(img[:3, :3], 3))
# 2. Matrixoperationen = Bildtransformationen
img_transpose = img.T # Transponieren: Zeilen und Spalten vertauschen
img_flip_lr = img[:, ::-1] # Horizontal spiegeln: Spaltenindizes umkehren
img_flip_ud = img[::-1, :] # Vertikal spiegeln: Zeilenindizes umkehren
img_crop = img[10:54, 10:54] # Zuschneiden: Slicing, um eine Untermatrix zu erhalten
# 3. Handgeschriebener Mittelwert-Weichzeichner (5x5-Faltungskern, ohne OpenCV)
def box_blur(mat, k=5):
"""Wende einen Mittelwert-Weichzeichner auf die Matrix an, indem ein k x k gleitendes Fenster verwendet wird"""
pad = k // 2
# Den Rand mit Randwerten auffüllen (Edge-Padding)
padded = np.pad(mat, pad, mode="edge")
out = np.zeros_like(mat)
for i in range(mat.shape[0]):
for j in range(mat.shape[1]):
# Nimm die k x k Nachbarschaft und berechne den Mittelwert
out[i, j] = padded[i:i+k, j:j+k].mean()
return out
img_blur = box_blur(img, k=5)
print("BEISPIEL erster 3x3-Teil der weichgezeichneten Matrix:\n",
np.round(img_blur[:3, :3], 3))
# 4. Visuelle Vergleichsgrafik speichern
fig, axes = plt.subplots(2, 3, figsize=(12, 8))
titles = ["Originalbild (Matrix)", "Transponieren img.T",
"Horizontal spiegeln img[:, ::-1]",
"Vertikal spiegeln img[::-1, :]",
"Zuschneiden img[10:54, 10:54]",
"Mittelwert-Weichzeichner (5x5-Faltung)"]
images = [img, img_transpose, img_flip_lr,
img_flip_ud, img_crop, img_blur]
for ax, title, im in zip(axes.flat, titles, images):
ax.imshow(im, cmap="gray", vmin=0, vmax=1)
ax.set_title(title, fontsize=11)
ax.axis("off")
plt.tight_layout()
plt.savefig(os.path.join(OUT, "01_image_as_matrix.png"), dpi=130)
print(f"\nBEISPIEL Visualisierungsergebnis gespeichert unter {OUT}/01_image_as_matrix.png")
EXAMPLE 图像矩阵形状 (shape): (64, 64) 图像矩阵前 3x3 部分: [[0. 0.008 0.016] [0.008 0.016 0.023] [0.016 0.023 0.031]] EXAMPLE 模糊后矩阵前 3x3 部分: [[0.009 0.011 0.013] [0.01 0.013 0.016] [0.011 0.016 0.021]] EXAMPLE 可视化结果已保存到 .../outputs/01_image_as_matrix.png
Wie Sie sehen, werden nach dem Weichzeichnen die numerischen Unterschiede zwischen benachbarten Pixeln kleiner — das ist genau die mathematische Essenz von "Weichzeichnen":Ersetzen Sie den ursprünglichen Pixelwert durch den Mittelwert der Nachbarschaft。
Anwendungsszenarien in der KI
| KI-Szenario | Wie man Matrizen verwendet |
|---|---|
| Faltungsneuronales Netz (CNN) | Die Eingabe ist ein Tensor 4. Ordnung, der aus einem Stapel Bilder (batch, H, W, C) besteht, und jede Schicht schiebt einen Faltungskern (kleine Matrix) über die Eingabe |
| Datenaugmentierung | Während des Trainings werden Bilder zufällig gespiegelt, gedreht und zugeschnitten — alles sind Matrixoperationen, die zum Erweitern des Trainingssatzes verwendet werden. |
| Bildvorverarbeitung | Bevor sie in das Modell eingespeist werden, werden sie einheitlich auf eine feste Größe zugeschnitten (z. B. 224x224) — das ist Matrix-Slicing und Skalierung. |
| Stilübertragung | Stelle das Bild als Merkmalsmatrix dar und ändere die "Stil"-Merkmale durch Matrixoperationen. |
Weitere Erweiterungenndarray in NumPy und Tensor in PyTorch sind im Wesentlichen dasselbe: eine mehrdimensionale numerische Tabelle. Die Matrix zu verstehen bedeutet, die grundlegendste Datenstruktur in Deep-Learning-Frameworks zu verstehen.