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):

3x3-Graustufenbild Eine Matrix, 9 Zahlen
\[ M = \begin{bmatrix} 0.0 & 0.5 & 1.0 \\ 0.3 & 0.7 & 0.6 \\ 0.8 & 0.2 & 0.4 \end{bmatrix} \]

Mit diesem Verständnis werden die verschiedenen Operationen der Bildverarbeitung klar:

Transponieren
img.T
Entlang der Diagonalen spiegeln
Horizontaler Spiegel
img[:, ::-1]
Links-rechts spiegeln
Vertikaler Spiegel
img[::-1, :]
Oben-unten spiegeln
Zuschneiden
img[10:54, 10:54]
Teilbereich extrahieren
Weichzeichnen
Gleitender Mittelwert des Faltungskerns
Nachbarschaftsmittelwert
Rotation
Koordinatentransformation
Matrixmultiplikation

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:

AktionMathematischer AusdruckNumPy-SyntaxBildeffekt
Transponieren\(M^T_{ij} = M_{ji}\)img.TZeilen 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 numpy as np
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-SzenarioWie 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
DatenaugmentierungWährend des Trainings werden Bilder zufällig gespiegelt, gedreht und zugeschnitten — alles sind Matrixoperationen, die zum Erweitern des Trainingssatzes verwendet werden.
BildvorverarbeitungBevor 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übertragungStelle das Bild als Merkmalsmatrix dar und ändere die "Stil"-Merkmale durch Matrixoperationen.

ndarray 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.

Weitere Erweiterungen