Lässt es sich mit cremefarbenem Papier, einer Tönung, mehr Kontrast oder größerer Schrift besser lesen? Wählen Sie Ihre Farben und Ihre Schrift, einmalig für alle Seiten.

Kostenlose Lektion

Verschieben, Drehen und Skalieren

Nach dieser Lektion: Ich kann ein Dreieck mit einer Matrix verschieben, drehen und skalieren.

Lektion, 70 Min.4 BefehleComputer-Vision-Lab: Pixel, Schwellenwerte und Objekte zählen in JupyterLab

Wie ein Spiel eine Figur bewegt

Eine Transformation verschiebt, dreht oder vergrößert eine Form, indem sie die Koordinaten jedes Eckpunkts neu berechnet. So bewegt ein Spiel eine Figur und so zoomt eine Karte.

Alle drei Bewegungen lassen sich mit einer einzigen Rechenart ausdrücken, der Multiplikation mit einer Matrix. Das lernen Sie hier an einem Dreieck.

Am Ende dieser Lektion

Notiz

Ich kann ein Dreieck mit einer Matrix verschieben, drehen und skalieren.

Schlüsselwörter

BegriffWas er bedeutet
Transformationeine Rechnung, die Punkte bewegt
Matrixein Zahlenraster mit Zeilen und Spalten
Skalierungvergrößern oder verkleinern
Homogene Koordinatenein Punkt (x, y) wird zu (x, y, 1)
Verkettungzwei Transformationen nacheinander

Die Zellen, die Lernende ausfüllen, bleiben in dieser Vorschau leer.

Verschieben addiert, Skalieren multipliziert

Ein Dreieck besteht aus drei Eckpunkten. Zum Verschieben addieren Sie zu jedem Punkt dieselbe Zahl in x und in y. Zum Skalieren multiplizieren Sie beide Koordinaten mit einem Faktor.

Die Form bleibt beim Verschieben gleich. Beim Skalieren mit 2 wird sie doppelt so breit und doppelt so hoch, wenn der Ursprung (0, 0) der feste Punkt ist.

Beispiel: ein Dreieck, verschoben und skaliert

PunktOriginalVerschoben um (10, 4)Skaliert mit 2
A(0, 0)(10, 4)(0, 0)
B(8, 0)(18, 4)(16, 0)
C(0, 6)(10, 10)(0, 12)

Die Zellen, die Lernende ausfüllen, bleiben in dieser Vorschau leer.

Eine Matrix macht aus jedem Punkt einen neuen

Eine Matrix ist ein Raster aus Zahlen. Um auch das Verschieben als Matrix zu schreiben, bekommt jeder Punkt eine dritte Zahl: aus (x, y) wird (x, y, 1). Das sind homogene Koordinaten.

Dann ist die Matrix 3 mal 3. Jede Zeile der Matrix, Stelle für Stelle mit dem Punkt multipliziert und addiert, liefert eine neue Zahl des Punkts.

Beispiel: Matrix mal Punkt (1, 1, 1)

Zeile der MatrixRechnungErgebnis
2, 0, 32 mal 1 plus 0 mal 1 plus 3 mal 15
0, 2, 10 mal 1 plus 2 mal 1 plus 1 mal 13
0, 0, 10 mal 1 plus 0 mal 1 plus 1 mal 11

Die Zellen, die Lernende ausfüllen, bleiben in dieser Vorschau leer.

Eine Matrix auf einen Punkt anwenden

Code: python
# Matrix mal Punkt, Zeile für Zeile.
m = [[2, 0, 3], [0, 2, 1], [0, 0, 1]]
p = [1, 1, 1]
x = m[0][0] * p[0] + m[0][1] * p[1] + m[0][2] * p[2]
y = m[1][0] * p[0] + m[1][1] * p[1] + m[1][2] * p[2]
print("Neuer Punkt:", x, y)
# Ändern Sie p auf [4, 0, 1] und starten Sie erneut.

Das Lab rechnet die Matrix mit NumPy nach

NumPy ist die Bibliothek, die mit Zahlenrastern rechnet. Das Zeichen @ multipliziert eine Matrix mit einem Punkt. Der erste Befehl wendet die Matrix aus der Tabelle auf (1, 1, 1) an.

Er gibt [5 3 1] aus, wie Ihre Rechnung. Der zweite dreht (4, 0) um 90 Grad und gibt [0 4 1] aus: Der Punkt wandert von der x-Achse auf die y-Achse.

Die Matrix mal einen Punkt rechnen

Befehl
docker exec jupyter python3 -c "import numpy as np; m = np.array([[2, 0, 3], [0, 2, 1], [0, 0, 1]]); print(m @ np.array([1, 1, 1]))"

Hier angezeigt, nicht ausgeführt. Erstellen Sie ein kostenloses Konto, um „Ausführen“ zu drücken und ihn im Terminal Ihres eigenen Labs einzugeben.

Den Punkt (4, 0) um 90 Grad drehen

Befehl
docker exec jupyter python3 -c "import numpy as np; d = np.array([[0, -1, 0], [1, 0, 0], [0, 0, 1]]); print(d @ np.array([4, 0, 1]))"

Hier angezeigt, nicht ausgeführt. Erstellen Sie ein kostenloses Konto, um „Ausführen“ zu drücken und ihn im Terminal Ihres eigenen Labs einzugeben.

Bei zwei Transformationen zählt die Reihenfolge

Zwei Matrizen lassen sich zu einer verketten: t @ d @ p dreht zuerst, weil d am nächsten beim Punkt steht, und verschiebt danach. Es wirkt immer die Matrix rechts zuerst.

Verschieben und Drehen sind nicht austauschbar. Der Punkt (1, 0) landet bei erst drehen, dann um (5, 2) verschieben bei (5, 3). Erst verschieben, dann drehen bringt ihn nach (-2, 6).

Beispiel: dieselben zwei Schritte in zwei Reihenfolgen

ReihenfolgeSchritt 1Schritt 2Ergebnis
Erst drehen, dann verschieben(1, 0) wird (0, 1)(0, 1) wird (5, 3)(5, 3)
Erst verschieben, dann drehen(1, 0) wird (6, 2)(6, 2) wird (-2, 6)(-2, 6)

Die Zellen, die Lernende ausfüllen, bleiben in dieser Vorschau leer.

Beide Reihenfolgen nachrechnen

Befehl
docker exec jupyter python3 -c "import numpy as np; t = np.array([[1, 0, 5], [0, 1, 2], [0, 0, 1]]); d = np.array([[0, -1, 0], [1, 0, 0], [0, 0, 1]]); p = np.array([1, 0, 1]); print(t @ d @ p, d @ t @ p)"

Hier angezeigt, nicht ausgeführt. Erstellen Sie ein kostenloses Konto, um „Ausführen“ zu drücken und ihn im Terminal Ihres eigenen Labs einzugeben.

Das Lab zeichnet das verschobene Dreieck

Der nächste Befehl zeichnet das Original als Umriss und das verschobene Dreieck gefüllt in dreiecke.png. Er gibt die neuen Ecken aus: [[10, 4], [18, 4], [10, 10]].

Die Datei zeigt zwei weiße Dreiecke auf Schwarz: oben links ein Umriss, rechts darunter ein gefülltes Dreieck derselben Form. Das Pixel an der Ecke (10, 4) ist weiß.

Das verschobene Dreieck zeichnen

Befehl
docker exec jupyter python3 -c "import numpy as np; from PIL import Image, ImageDraw; t = np.array([[0, 8, 0], [0, 0, 6], [1, 1, 1]]); m = np.array([[1, 0, 10], [0, 1, 4], [0, 0, 1]]); q = m @ t; b = Image.new('L', (24, 16), 0); d = ImageDraw.Draw(b); d.polygon([(0, 0), (8, 0), (0, 6)], outline=255); d.polygon(list(zip(q[0].tolist(), q[1].tolist())), fill=255); b.resize((240, 160), Image.NEAREST).save('dreiecke.png'); print(q[:2].T.tolist(), b.getpixel((10, 4)))"

Hier angezeigt, nicht ausgeführt. Erstellen Sie ein kostenloses Konto, um „Ausführen“ zu drücken und ihn im Terminal Ihres eigenen Labs einzugeben.

Ein häufiger Fehler

Warnung

Viele denken, die Reihenfolge der Schritte spiele keine Rolle, weil jeder Schritt allein richtig ist. Zusammen aber nicht: Erst verschieben und dann drehen dreht auch die Verschiebung mit. Schreiben Sie die Schritte immer von rechts nach links in die Matrixkette.

Über dieses Lab und seinen Quellcode: Computer-Vision-Lab: Pixel, Schwellenwerte und Objekte zählen in JupyterLab

Sie unterrichten eine Gruppe? Weisen Sie dieses Modul Ihren Studierenden zu, mit Handbuch für Lehrende, automatisch geprüften Aufgaben und einem Lab für jede Person.